32bit コンパイラで long long 書式に int 型変数で出力すると上位dword が初期化されない件

#include <stdio.h>
void main(){
int x=0x123;
printf("[%016llx]\n", 0xaaaaaaaaaaaaaaaa);
printf("[%016llx]\n", x);
printf("[%016llx]\n", 0x54321234567);
printf("[%016llx]\n", x);
printf("[%016llx]\n", 0xbbbbbbbbbbbbbb);
}

問題のコード。64bit コンパイラと32 bit コンパイラで結果を比較してみよう

[aaaaaaaaaaaaaaaa]
[aaaaaaaa00000123]
[0000054321234567]
[0000054300000123]
[00bbbbbbbbbbbbbb]
こちらは32bit

[aaaaaaaaaaaaaaaa]
[0000000000000123]
[0000054321234567]
[0000000000000123]
[00bbbbbbbbbbbbbb]
64bitの場合は正しく出力される
32bitの場合は long longで int を参照した箇所の上位 DWORD が前の変数の値のまま初期化されていないことが分かる。 

バグですね  (((・ω・))) ※ 2019/11の gcc 8.3.1の不具合

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です