为什么malloc(1000*1000*1000*1000*1000*...*1000)能在32位机器上分配成功并使用

首先这个问题我们直接通过代码运行告诉答案:

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)是能过编译了。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值