情况如下:
现在在64位机器上,哪个语句是正确的(如果有的话):
假设由于溢出,带符号的二进制整数11111111001101100000101011001000只是负数.这是一个实际存在的问题,因为您可能希望分配比在32位整数中描述的更多的字节.但后来它被读入64位整数.
Malloc将其读取为64位整数,发现11111111001101100000101011001000#################################是一个通配符位,表示在原始整数之后存储的任何数据.换句话说,它读取接近其最大值2 ^ 64的结果并尝试分配一些quintillion字节.它失败.Malloc将其读取为64位整数,转换为0000000000000000000000000000000011111111001101100000101011001000,可能是因为它是如何加载到寄存器中而使大量位为零.它不会失败,但会分配负内存,就像读取正无符号值一样.Malloc读取它为64位整数,转换为################################11111111001101100000101011001000,可能是因为它是如何加载到寄存器中的#一个表示寄存器中先前数据的通配符.根据最后一个值,它无法完全失败.我实际测试了这个,导致malloc失败(这意味着1或3是正确的).我认为1是最合乎逻辑的答案.我也知道修复(使用size_t作为输入而不是int).
我真的想知道究竟发生了什么.出于某种原因,我没有找到任何关于如何在64位机器上实际处理32位整数以进行这种意外"演员"的澄清.我甚至不确定它在寄存器中是否真的很重要.