1

次のコードを見てください。

#include <stdio.h>

int main(void)  
{  
int a;

a = 2147483647;
printf("a + 1 = %d \t sizeof (a + 1) = %lu\n", a + 1, sizeof (a + 1));
printf("a + 1L = %ld \t sizeof (a + 1L) = %lu\n", a + 1L, sizeof (a + 1L));

a = -1;
printf("a + 1 = %d \t sizeof (a + 1) = %lu\n", a + 1, sizeof (a + 1));
printf("a + 1L = %ld \t sizeof (a + 1) = %lu\n", a + 1L, sizeof (a + 1L));  //why a + 1L does not yield long integer ?

return 0;
}  

これにより、次の出力が得られます。

a + 1 = -2147483648   sizeof (a + 1) = 4  
a + 1L = 2147483648   sizeof (a + 1L) = 8  
a + 1 = 0    sizeof (a + 1) = 4  
a + 1L = 0   sizeof (a + 1) = 8

a + 1L最後の行で 4294967296 のような長整数ではなく 0 が生成されるのはなぜですか?

4

2 に答える 2

5

最後の行の + 1L で long integer が 4294967296 にならないのはなぜですか?

int-1 を に変換すると、long intlong intが -1 になり、-1 + 1 = 0.

別の型への変換は、ターゲット型が符号なし 32 ビット型である場合に-1のみ発生します (通常、提供されている場合は、通常はそうです)。ただし、値に 1 を追加すると 0 にラップされます。4294967295unsigned intuint32_t

したがって、 を取得4294967296するには、中間キャストが必要になります。

(uint32_t)a + 1L

そのため、-1最初にuint32_twith value4294967295に変換され、次に に変換されlongます。

于 2013-02-07T10:24:51.710 に答える
1

最初のケース: 2147483647 は、16 進数表現 0x7fffffff の 32 ビット符号付き値です。これに 1 を追加すると、32 ビット値 16 進数 0x80000000 が得られます。これは、32 ビット符号付き整数 (オーバーフローのため) では -2147483648 であり、64 ビット符号付き整数と見なされる場合は 2147483648 の値になります。

2 番目のケース: -1 は、16 進数表現 0xffffffff の 32 ビット符号付き値です。これに 1 を追加すると、32 ビット値の 16 進数 0x00000000 が得られます。これは、signed int では 0 です。

64ビットで1を追加すると、最初に符号拡張が発生するため、実際には0xFFFFFFFFFFFFFFFFと0x0000000000000001を追加すると、合計は予想どおり0になります。

符号の拡張を考えれば、あいまいさはありません。

于 2013-02-07T10:47:31.433 に答える