abstract:一、獲取數(shù)據(jù)類型在系統(tǒng)中的位數(shù) 在不同的系統(tǒng)中,數(shù)據(jù)類型的字節(jié)數(shù)(bytes)不同,位數(shù)(bits)也有所不同,那么對應的取值范圍也就有了很大的不同,那我們怎么知道你當前的系統(tǒng)中C語言的某個數(shù)據(jù)類型的字節(jié)數(shù),位數(shù)呢? 由于本人是初學,所以下面的代碼是硬編程了,獲取一個數(shù)據(jù)類型的字節(jié)數(shù)和位數(shù):/* 獲取數(shù)據(jù)類型在當前系統(tǒng)中的字節(jié)數(shù)(bytes)和位數(shù)(bits) */#inc
一、獲取數(shù)據(jù)類型在系統(tǒng)中的位數(shù)
在不同的系統(tǒng)中,數(shù)據(jù)類型的字節(jié)數(shù)(bytes)不同,位數(shù)(bits)也有所不同,那么對應的取值范圍也就有了很大的不同,那我們怎么知道你當前的系統(tǒng)中C語言的某個數(shù)據(jù)類型的字節(jié)數(shù),位數(shù)呢?
由于本人是初學,所以下面的代碼是硬編程了,獲取一個數(shù)據(jù)類型的字節(jié)數(shù)和位數(shù):
/* 獲取數(shù)據(jù)類型在當前系統(tǒng)中的字節(jié)數(shù)(bytes)和位數(shù)(bits) */#include <stdio.h>int main(void) { //1個字節(jié) = 8位 printf("整數(shù)類型:int;bytes = %d;bits = %d\n",sizeof(int),sizeof(int) * 8); return 0; }
上面的代碼中使用的函數(shù)sizeof來獲取數(shù)據(jù)類型對應的字節(jié)數(shù),對應的位數(shù)也就出來了,那么很多時候在編程的時候,要是我們不知道數(shù)據(jù)類型在本系統(tǒng)中的位數(shù)和取值范圍的話,很容易出現(xiàn)問題:數(shù)據(jù)類型的值向上溢出,或者向下溢出了,而我們還不知到怎么回事,這個時候找問題就很費勁了
二、獲取數(shù)據(jù)類型對應的取值范圍
首先來舉個例子:
數(shù)據(jù)類型:char(字符串,實際以整數(shù)存儲)
字節(jié)數(shù):不管在哪個操作系統(tǒng)中都是1個字節(jié)
位數(shù):1個字節(jié) = 8位(以二進制存儲)
無符號取值范圍:00000000 ~ 11111111 (有8位二進制數(shù)存儲),那么結(jié)果char的取值范圍是0~255
有符號取值范圍:-2^7 ~ (2^7)-1 也就是-128 ~ 127
那可能你會問了,為什么計算有符號的取值范圍時,最后需要減1呢?請看下面的分析:
有符號取值范圍分正數(shù):127 =(轉(zhuǎn)換成二進制)=>1111111(這里二進制只有7位,換句話說,實際二進制值是01111111)
有符號取值范圍分負數(shù):-128 =(轉(zhuǎn)換成二進制)=>10000000(剛好是8位)
不知道大家有沒有發(fā)現(xiàn)他們的區(qū)別?
區(qū)別:
正數(shù):二進制的最高位是0,最高位是0表示正數(shù)
負數(shù):二進制的最高位是1,最高位是1表示負數(shù)
也就是說二進制也有正數(shù)和負數(shù)的區(qū)別(講個插曲,之前我學進制轉(zhuǎn)換的時候做練習題,看到有負數(shù),我當時就干蒙了,現(xiàn)在才明白是這么區(qū)分的)
同樣的,其他的數(shù)據(jù)類型都是這么計算的,下面總結(jié)一下計算公式,方便快速計算數(shù)據(jù)類型的取值范圍:
下面的bits = 數(shù)據(jù)類型的字節(jié)數(shù) * 8;
signed typeName(有符號的數(shù)據(jù)類型取值范圍):-2^(bits-1) ~ (2^(bits-1))-1
unsigned typeName(無符號的數(shù)據(jù)類型取值范圍):(2^bits)-1