共计 739 个字符,预计需要花费 2 分钟才能阅读完成。
背景
最近在学习 c ++,看书看到数据类型时,运行以下代码时打印后果:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
short int i;
short unsigned int j;
j = 40000;
i = j;
cout << i << " " << j;
return 0;
}
打印:-25536 40000
因而,具体讨论一下对数据类型进行超过范畴赋值时,程序的计算过程
探讨
一、首先明确,正数在计算机中是应用补码示意的
拿一个字节的 char 类型举例,-1,
原码是 1000 0001,其中第 8 位是符号位
反码是 1111 1110,补码 = 反码 +1:11111111;用无符号整型示意的话,补码的值为 2^8 + (-1)
所以当 2^8 + (-1) = 255 赋值给有符号单字节数据类型 a(-128~127)时,a 的值为 -1
-4
原码是 1000 0100,反码:1111 1011,补码:1111 1100;用无符号整型示意的话,补码的值为 2^8 + (-4)
-128
没有原码,但在计算机中用补码示意为 1000 0000,用无符号整型示意的话,补码的值为 2^8 + (-128)。因为 2^8 的二进制为 1 0000 0000,128 的二进制为 1000 0000,所以 2^8 + (-128) =
1 0000 0000 – 1000 0000 = 1000 0000
二、回到以后的场景
短整型在 c ++ 中占两个字节,short int 的范畴为 -32768~32767,unsigned short int 的范畴为 0~65535. 显然,将 40000 赋值给 short int 超过了存储范畴,则 i 的补码的值为 40000,
假如 i 的值是 -a(a 是负数),2^16+(-a)=40000,-a=-25536
所以 i 打印进去的值就是 -25536
正文完