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