背景
最近在学习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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。