【发布时间】:2017-01-24 10:02:07
【问题描述】:
我的目标是创建一个大于 4 字节的整数类型,如果我使用 long,则为 8。我尝试 malloc 尝试在内存中为更大的整数提供更多字节,但它在第 31 次迭代时仍然中断(给出一个负数)。这是我的代码:
int main()
{
int x = 31; //(normally an int can do up to 30 without going negative so this is my test number)
int i;
int *bigNum = NULL;
bigNum = malloc((sizeof(int)*2));
*bigNum = 1;
for (i=0; i<x; i++) {
*bigNum = *bigNum * 2;
printf("%d \n", *bigNum);
}
free(bigNum);
}
输出:
2
4
...
..
...
1073741824
-2147483648
【问题讨论】:
-
整数溢出。你系统上的
INT_MAX是什么? -
它在第 31 次迭代时仍然中断 ....您有一个非常好的水晶证据表明正在发生的事情.... ...
-
这里真的没有必要使用
malloc和动态分配和指针。只需像普通变量一样定义您的bigNum变量也可以正常工作(或者就像您现在拥有的一样)。 -
至于发生了什么,你有一个溢出。虽然溢出有符号整数(就像您所做的那样)在技术上是未定义的行为,但实际发生的事情取决于负数在您的计算机上的表示方式。阅读two's complement了解更多信息。