首先这个问题我们直接通过代码运行告诉答案:
int main()
{
long long aa = 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000;
void* a = malloc(1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000);
std::cout << aa;
return 0;
}
首先这个问题表现形式是:运行malloc分配内存,这个明显在32位机器上是超过4g内存的,但是在运行时并没有报错,还是能正常运行。下面就会回答这个问题:
首先int会自动向上转为longlong,然后longlong表达的整数是有范围的,编译器会自动对溢出值进行处理。所以我们直接将malloc的值赋给longlong类型的aa变量,然后看输出值为多少,来看到底malloc(1000*...*1000)到底变成什么了:
然后使用补码转原码工具
可以看到补码转原码值直接为0了。所以上述代码其实变为 malloc(0),这就是为什么malloc(1000*...*1000)是能过编译了。