C語言中資料型別的表示範圍

2021-06-26 12:23:04 字數 1394 閱讀 7020

問題:sizeof(int) = 2,int的表示範圍為什麼是-2^15~2^15-1?

答:對於有符號數,最高位為符號位。二進位制原碼最大值為0111111111111111=2^15-1,最小值為 1111111111111111=-(2^15-1),而0分為+0和-0,即0000000000000000和

1000000000000000。所以,當以二進位制原碼表示時,int的表示範圍是-32767~-0和+0~32767。注意+0等於-0,因而表示範圍中不同的數值個數有2^16-1個,比16位二進位制能夠提供的2^16個編碼少1個。

但計算機中是採用二進位制補碼儲存資料的。正數編碼不變,即從0000000000000000到0111111111111111,範圍是0~2^15-1。負數編碼需要把除符號位以後的部分取反加1。

-32767的補碼為1000000000000001,-0的補碼為0000000000000000。注意到+0和-0在補碼系統中的編碼是一樣的,而16位二進位制數可表示2^16個編碼,在補碼中零的編碼只有乙個(+0和-0的編碼一樣),所以補碼中會比原碼多乙個編碼出來,這個編碼就是1000000000000000。因為任何乙個原碼都不可能在轉成補碼時變成1000000000000000,所以,人為規定1000000000000000這個補碼編碼為-32768。所以,int的表示範圍在補碼系統中是-32768~32767。

注意,二進位制的最小值確實是1111111111111111,只是二進位制補碼的最小值才是1000000000000000。

下面舉幾個容易錯的例題。

#include int main(void) 

結果為:-128。char的表示範圍是-128~127。因為127 + 1 = 128,二進位制表示為10000000,對於有符號的ch來說,最高位為1表示負數。

#include int main(void) 

結果為:0。ch = 255在計算機中的儲存為:(000....)11111111,(000....)11111111+1 = (000...)0001 00000000,然後再將最後八位二進位制擷取給ch,由於最後八位全是0,因此ch = 0。

對於unsigned型別來說,編譯器必須調整越界值使其滿足要求。編譯器會將該值對unsigned型別的可能取值數目求模,然後取所得值。例如:8位的unsigned char其取值範圍從0到255,將336儲存到8位的unsigned char中,則實際賦值為80,因為336 mod 256 = 80。

負數總是超出取值範圍,有些語言將負數賦給unsigned型別是非法的,但在c++中是合法的,其結果是該負數對該型別的取值個數求模後的值。例如:將-1賦給8位的unsigned char,結果是255,因為-1 mod 256 = 255。

C 基本資料型別及其表示範圍

原文 1.長度 型別名型別位元組 表示範圍 char 字元型1 128 127 unsigned char 無符號字元型 10 255 signed char 有符號字元型 與字元型相同 1 128 127 int整型 與機器有關 unsigned int 無符號整型 與機器有關 signed in...

C 基本資料型別大小及表示範圍

ansi c c 基本資料型別 type size 數值範圍 無值型void 0 byte 無值域布林型 bool 1 byte true false 有符號短整型 short int signed short int 2 byte 32768 32767 無符號短整型 unsigned short...

C 基本資料型別大小及表示範圍

ansi c c 基本資料型別 type size 數值範圍 無值型void 0 byte 無值域布林型 bool 1 byte true false 有符號短整型 short int signed short int 2 byte 32768 32767 無符號短整型 unsigned short...