26

整数定数のデフォルトの型は符号付きですか、符号なしですか? 0x80000000 などの場合、接尾辞なしで符号付き整数定数または符号なし整数定数として使用することをどのように決定できますか?

符号付き整数定数の場合、次のケースをどのように説明しますか?

printf("0x80000000>>3 : %x\n", 0x80000000>>3);

出力:

0x80000000>>3 : 10000000

以下のケースは、プラットフォームが論理ビット単位シフトではなく、算術ビット単位シフトを使用していることを示している可能性があります。

int n = 0x80000000;

printf("n>>3: %x\n", n>>3);

出力:

n>>3: f0000000
4

2 に答える 2

28

C では、10 進数、8 進数、および 16 進数の定数に対して異なる規則があります。

10 進数の場合、値が収まる最初の型です: int, long,long long

16 進数の場合int、値が収まる最初のタイプunsigned intです: 、、、、、、longunsigned longlong longunsigned long long

たとえば、システムでは32-bit intand unsigned int: 0x80000000isunsigned intです。

10 進定数の場合、C90 には異なるルールがあったことに注意してください (ただし、16 進定数のルールは変更されていません)。

于 2012-07-03T12:08:14.857 に答える
9

符号付き整数に収まる場合は符号付きです。u無署名にするには、接尾辞を追加します1234u

符号なしの変数に代入することで、符号付きの値を符号なしに変換できます。

unsigned int i = 1234u; // no conversion needed
unsigned int i = 1234;  // signed value 1234 now converted to unsigned

の場合、プラットフォームで int が 32 ビットの場合、signed int に収まらないため、unsigned0x80000000になります。


ただし、注意すべきもう 1 つの点は、右シフトの動作がプラットフォームに依存することです。一部のプラットフォームでは符号保存 (算術) であり、一部のプラットフォームでは単純なビット単位のシフト (論理) です。

于 2012-07-03T12:03:15.623 に答える