我的问题是:从int32到int64的转换如何工作?我对这样做的功能不感兴趣,我对 HOW 他们这样做很感兴趣。比特级会发生什么?
我特别感兴趣的是负int32(即。-23)如何转换为int64。
答案 0 :(得分:2)
关于符号扩展中发生的事情的答案取决于表示有符号整数的方式。有几种方法可用于表示二进制形式的负数。最常见的变体是:
最有可能是另外几个变种,但由于该列表中的第1个可能涵盖了此处读者将要遇到的至少99%的计算机系统,而其他四个将是剩余系统中的绝大多数(事实上,我在“现实生活”中只遇到了Excess K,其他人在我30多年的计算机工作中,仍然是理论上的。最后两种形式在C99标准中是不允许的,所以它不太可能[但是并不是绝对禁止为不符合标准的目标系统编写C编译器 - 你不能声称它支持完整的C99标准]
我现在将解释符号扩展如何在这些数字系统中起作用。我不打算解释每个系统在其他方面如何工作,或者为什么选择特定系统,使用它们或类似的东西。这可能属于“计算机体系结构书”。有关不同数字系统的更多详细信息,Wikipidea here中有一篇文章。
我将举例说明两个4位数字如何转换为它们各自的8位版本 - 为了节省大量的1和0,原则是相同的,只是更多的数字。
两个补充:
取第31位(符号位)并将其复制到32..63位。大多数64位处理器都有执行此步骤的特定指令,因此从32位到64位的转换是自动的。
值5是0101作为4位数,复制位3 - > 0099101.-4比特中的1010是1010,复制比特3 - > 11111010.
一个补充:
与两个补码相同 - 唯一真正的区别是有一个负零,由64个“”组成。“
值5是0101作为4位数,复制位3到位4..7-> 0099101.-4比特为1001,将比特3复制到比特4..7-> 11111001.
标志和数量
将第31位移到第63位。其余的扩展数字保持为零。
值5是0101作为四位数,将位3复制到位7并用零替换 - > 00000101.-4比特为1110,将比特3复制到比特7,并用零替换 - > 10000110
超额K
由于过量的K是“有偏”的表示,符号扩展意味着标准化,然后用较大的常数重新偏置数字。换句话说,减去2 31 并加上2 63 [或“add 2 63 -2 31 ”]
值5是1101作为四位数,减去8,然后加上128 - > 4个位10000101 -6是0010,减去8,然后加128 - > 01111010
(这通常用于浮点数的指数 - 我相信,与最高位的符号一起,允许所有“常规”浮点数作为32或64-进行比较位整数并且仍然按预期运行 - 但不要在程序中使用它!)。
Base -2
这是一个非常奇怪的,因为值是-2 value ,如果你按照上面的链接,你会看到并不是一件容易的事。奇数位为负,偶数位值为正。但是,符号扩展是微不足道的 - 只需将零添加到相关级别,因为每个位都有一个符号或不符合偶数或奇数。
值5为0101作为四位数,填充零以扩展:00000101.-4位为1110,用零填充给00001110。