C語言數據類型取值范圍


一、獲取數據類型在系統中的位數

  在不同的系統中,數據類型的字節數(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_MINFLT_MAX獲取浮點數的取值范圍

  本人初學,有錯誤歡迎指出來,大家共同進步!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM