プログラムちょい替え(3)Endian確認プログラム、64bitを追加(C言語)。

https://ja.wikipedia.org/wiki/エンディアン

に、下記のようなEndian確認用のプログラムがあった。


endian.c

#include <stdint.h>

#include <stdio.h>

int main (int argc, char **argv)
{
union
{
uint32_t b4 ; /* 4byte */
uint16_t b2 [2] ; /* 2byte×2 */
uint8_t b1 [4] ; /* 1byte×4 */
} bytes ;

bytes.b4 = 0x12345678 ;
printf ("bytes.b4: %08X\n", bytes.b4) ;
printf ("bytes.b2: %04X, %04X\n", bytes.b2[0], bytes.b2[1]) ;
printf ("bytes.b1: %02X, %02X, %02X, %02X\n", bytes.b1[0], bytes.b1[1], bytes.b1[2], bytes.b1[3]) ;
return 0 ;
}


せっかくなので64ビットに拡張した。


endian2.c

// https://ja.wikipedia.org/wiki/エンディアン

// arranged by Dr. Kiyoshi Ogawa
#include <stdint.h>
#include <stdio.h>

int main (int argc, char **argv)
{
union
{
uint64_t b8 ; // 8byte
uint32_t b4 [2] ; // 4byte x 2
uint16_t b2 [4] ; // 2byte × 4
uint8_t b1 [8] ; // 1byte × 8
} bytes ;

bytes.b8 = 0x123456789ABCDEF0 ;
printf ("bytes.b8: %16llX\n", bytes.b8);
printf ("bytes.b4: %08X, %08X \n", bytes.b4[0], bytes.b4[1]) ;
printf ("bytes.b2: %04X, %04X, %04X, %04X \n", bytes.b2[0], bytes.b2[1], bytes.b2[2], bytes.b2[3]) ;
printf ("bytes.b1: %02X, %02X, %02X, %02X, %02X, %02X, %02X, %02X \n", bytes.b1[0], bytes.b1[1], bytes.b1[2], bytes.b1[3], bytes.b1[4], bytes.b1[5], bytes.b1[6], bytes.b1[7]) ;
return 0 ;
}


mac book pro(intel corei5)での実行結果は

$ cc endian2.c

$ ./a.out
bytes.b8: 123456789ABCDEF0
bytes.b4: 9ABCDEF0, 12345678
bytes.b2: DEF0, 9ABC, 5678, 1234
bytes.b1: F0, DE, BC, 9A, 78, 56, 34, 12

64bit出力のため%16llX としたところは、

$ cc -v

Apple LLVM version 10.0.0 (clang-1000.11.45.5)
Target: x86_64-apple-darwin17.7.0
$ cc endian2.c
endian2.c:17:30: warning: format specifies type 'unsigned int' but the argument
has type 'uint64_t' (aka 'unsigned long long') [-Wformat]
printf ("bytes.b8: %16X\n", bytes.b8);
~~~~ ^~~~~~~~
%16llX
1 warning generated.

という警告で、clangが治し方を教えてくださった。

dockerのgccでは、

$ cc -v

gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
$ cc endian2.c
$ ./a.out
bytes.b8: 9ABCDEF0
bytes.b4: 9ABCDEF0, 12345678
bytes.b2: DEF0, 9ABC, 5678, 1234
bytes.b1: F0, DE, BC, 9A, 78, 56, 34, 12

警告ださずに、知らんぷりして、半分しか出力してくれなかった。

「%16llX」に治したら、ちゃんと全部出力するようになった。

docker hubに登録した。実行するには、

docker run -it kaizenjapan/wireless_withc /bin/bash

dockerでは、

# cd wireless

# cc endian2.c
# ./a.out

@SaitoAtsushi さんからのコメントで直した版


endian3.c

#include <inttypes.h>

#include <stdint.h>
#include <stdio.h>

int main (int argc, char **argv)
{
union
{
uint64_t b8 ; // 8byte
uint32_t b4 [2] ; // 4byte x 2
uint16_t b2 [4] ; // 2byte × 4
uint8_t b1 [8] ; // 1byte × 8
} bytes ;

bytes.b8 = 0x123456789ABCDEF0 ;
printf ("bytes.b8: %16" PRIX64 "\n", bytes.b8);
printf ("bytes.b4: %08" PRIX32 ", %08" PRIX32 " \n", bytes.b4[0], bytes.b4[1]) ;
printf ("bytes.b2: %04" PRIX16 ", %04" PRIX16 ", %04" PRIX16 ", %04" PRIX16 " \n", bytes.b2[0], bytes.b2[1], bytes.b2[2], bytes.b2[3]) ;
printf ("bytes.b1: %02" PRIX8 ", %02" PRIX8 ", %02" PRIX8 ", %02" PRIX8 ", %02" PRIX8 ", %02" PRIX8 ", %02" PRIX8 ", %02" PRIX8 " \n", bytes.b1[0], bytes.b1[1], bytes.b1[2], bytes.b1[3], bytes.b1[4], bytes.b1[5], bytes.b1[6], bytes.b1[7]) ;
return 0 ;
}


p.s.

上記dockerにはpythonの別プログラムが2つ入っている。

cal.py

log.py

# ./cal.py

# ./log.py

で実行するはず。


文書履歴(document history)

ver. 0.01 初稿 20190327 夕食前

ver. 0.02 docker 追記 20190327 夕食後

ver. 0.03 dockerでの実行方法追記 20190327 夜

ver. 0.04 表題変更 20190331

ver. 0.05 表題追記 20190514