コード スニペットを次に示します。
unsigned short a=-1;
unsigned char b=-1;
char c=-1;
unsigned int x=-1;
printf("%d %d %d %d",a,b,c,x);
出力は次のとおりです。
65535 255 -1 -1
?
誰でもこれを分析できますか?
符号付き数値用の whichを使用して値を出力して%d
います。値は符号付きの数値に「変換」されます (実際にはビットごとに同じままですが、最初のビットの解釈が異なります)。
unsigned char と short については、それらも 32 ビット int に変換されるため、値はそれに収まります。
を使用%lld
した (そして値を としてキャストした場合long long
、それ以外の場合は未指定の動作になる可能性があります) 場合でも、最後の 2 つの数値が符号なしとして出力される場合があります。
とにかく、符号なしの数値に使用してください。%u
255 のビット値は11111111
. 符号なしの数値として扱われる場合、255 になります。符号付きの数値として扱われる場合、-1 になります (通常、最初のビットで符号が決まります)。値を printf に渡すと、%d
値は次のような 32 ビット整数に変換されます00000000000000000000000011111111
。最初のビットが 0 であるため、値は単純に 255 として出力されますshort
。
32 ビット整数の場合は状況が異なります。すぐに11111111111111111111111111111111
値が割り当てられます。これは、符号付き表記で -1 を表します。また、printf で使用%d
しているため、 として解釈され-1
ます。
基本的に、「符号なし」変数に負の値を割り当てるべきではありません。あなたはコンパイラでいたずらをしようとしていますが、それが何をするかは誰にもわかりません。さて、「char n = -1;」「n」は合法的に負の値をとることができ、コンパイラはそれを処理する方法を知っているため、問題ありません。