背景

最近在学习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