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在最后一行产生 0 而不是长整数 4294967296 ?

4

2 回答 2

5

为什么最后一行中的 a + 1L 不会产生长整数 4294967296 ?

因为将int-1 转换为 along int会导致long int值为 -1,并且-1 + 1 = 0.

转换-1为另一种类型只会导致4294967295目标类型是无符号 32 位类型(通常unsigned int是这样,通常是uint32_t,如果提供)。但是,将值加 1 会换成 0。

因此,要获得4294967296,您需要一个中间演员,

(uint32_t)a + 1L

所以 that-1首先转换为uint32_twith 值4294967295,然后转换为long.

于 2013-02-07T10:24:51.710 回答
1

在第一种情况下:2147483647 是一个 32 位有符号值,十六进制表示为 0x7fffffff。向它添加 1 会得到一个 32 位值,十六进制 0x80000000,在 32 位有符号整数中为 -2147483648(由于溢出),如果将其视为 64 位有符号整数,则值为 2147483648。

在第二种情况下:-1 是一个 32 位有符号值,十六进制表示为 0xffffffff。向它添加 1 会得到一个 32 位值,十六进制 0x00000000,在有符号整数中为 0。

当您在 64 位中添加 1 时,首先会发生符号扩展,因此您实际上添加了 0xFFFFFFFFFFFFFFFF 和 0x0000000000000001,和预期的一样为 0。

如果您考虑符号扩展,则没有歧义。

于 2013-02-07T10:47:31.433 回答