博客 / 詳情

返回

數據類型:在超出範圍賦值情況下的計算方式

背景

最近在學習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

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.