为什么这种数据类型表现得很奇怪?

Ada*_*dam -2 c int printf

为什么第一个printf()只返回值-536870912,第二个返回a的最大值unsigned int与乘以65535*65535的结果之间的差值.(运行64位机器).

int x = 7 * 536870912;

printf("%d\n", x);// 536,870,912
//answer: 3,758,096,384 - 3 Billion
//returns : - 536870912

printf("%d\n", 65535 * 65535 );// 65,535
// answer : 4,294,836,225 4 Billion
// returns: -131071
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 6

通常,即使在64位系统上,该int类型仍然是带符号的32位类型.您可以通过打印轻松验证它sizeof(int).如果你想要更多,那么使用long long哪个保证至少是64位.

注意long,它可能是64位或者可能只有32位.使用long long.

  • @Adam Overflowing有符号整数实际上是[*undefined behavior*](https://en.wikipedia.org/wiki/Undefined_behavior).但是,考虑到大多数系统使用[二进制补码](https://en.wikipedia.org/wiki/Two's_complement),您可以轻松查看预期值的位模式,并计算出将出现的负数. . (4认同)