1

コード スニペットを次に示します。

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

?

誰でもこれを分析できますか?

4

2 に答える 2

6

符号付き数値用の 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ます。

于 2013-11-14T16:16:58.447 に答える
0

基本的に、「符号なし」変数に負の値を割り当てるべきではありません。あなたはコンパイラでいたずらをしようとしていますが、それが何をするかは誰にもわかりません。さて、「char n = -1;」「n」は合法的に負の値をとることができ、コンパイラはそれを処理する方法を知っているため、問題ありません。

于 2013-11-14T16:34:46.760 に答える