次のコードの出力を理解しようとしています: http://phrack.org/issues/60/10.html
参考までにここに引用します:
#include <stdio.h>
int main(void){
int l;
short s;
char c;
l = 0xdeadbeef;
s = l;
c = l;
printf("l = 0x%x (%d bits)\n", l, sizeof(l) * 8);
printf("s = 0x%x (%d bits)\n", s, sizeof(s) * 8);
printf("c = 0x%x (%d bits)\n", c, sizeof(c) * 8);
return 0;
}
私のマシンで得られる出力は次のとおりです。
l = 0xdeadbeef (32 bits)
s = 0xffffbeef (16 bits)
c = 0xffffffef (8 bits)
ここに私の理解があります: -
代入 s=l、c=l により、s と c が int に昇格され、それぞれ l の最後の 16 ビット (0xbeef) と最後の 8 ビット (0xef) を持つことになります。
Printf は、上記の各値 (l、s、および c) を符号なし整数として解釈しようとします (%x がフォーマット指定子として渡されるため)。出力から、符号拡張が行われたことがわかります。%x は unsigned int を表しているのに、なぜ s と c の印刷中に符号拡張が行われたのでしょうか? s の出力は 0x0000beef であり、c の出力は 0x000000ef であってはなりませんか?