背景

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


爱搞事的天蝎座
12 声望0 粉丝

下一篇 »
Git相关指令