Help us understand the problem. What is going on with this article?

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

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

kaizen_nagoya
I'm a network designer.I work on TOPPERS SmallestSetProfile Kernel,MISRA-C, STARC RTL Design StyleGuide (Verilog-HDL),HAZOP,ISO/IEC15504(AutomotiveSPICE),ISO26262. I was an editor on ISO/IEC 15504.
https://researchmap.jp/blogs/blog_entries/view/81777/f691323917cc4ea12caf0b03b34c8ea0?frame_id=442673
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした