溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言中有哪些類型

發(fā)布時間:2021-07-02 16:20:12 來源:億速云 閱讀:218 作者:Leah 欄目:大數(shù)據(jù)

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)C語言中有哪些類型,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

C語言的數(shù)據(jù)類型

類型的位寬

相比于高級語言,C語言的整型數(shù)據(jù)類型都有固定位寬,即類型占多少位。比如下面的數(shù)據(jù)類型:

signed char
unsigned char
signed short
unsigned short
signed int
unsigned int
signed long
unsigned long
signed long long
unsigned long long

由于平臺的不同,這些類型的位寬可能有些不相同,但是可以確定的是,每個平臺都有固定的位寬。為了在編程過程中明確指定位寬,增加代碼的可讀性和避免對平臺依賴,各個平臺都定義了自己指定位寬的基本類型,如Linux平臺上在stdint.h頭文件就定義了如下類型

int8_t
uint8_t
int16_t
uint16_t
int32_t
uint32_t
int64_t
uint64_t

每個類型都指定了符號和位寬,從字面上就可以看到這個類型的位寬是多少。由于位寬的存在,導(dǎo)致每個類型都有自己的最大值和最小值,比如Linux又分別定義了每種類型的最大值和最小值(無符號數(shù)的最小值都是0)

INT8_MIN
INT8_MAX
INT16_MIN
INT16_MAX
INT32_MIN
INT32_MAX
INT64_MIN
INT64_MAX

UINT8_MAX
UINT16_MAX
UINT32_MAX
UINT64_MAX

有了這些定義,C語言的運算基本都要都要這些邊界值,否則就會造成傳說中的整數(shù)溢出問題。如加法和乘法運算就要做如下判斷:

//計算兩個值的和
uint32_t sum(uint32_t a, uint32_t b)
{
    /*先判斷加法以后是否會溢出
    注意這里不能用 (a+b)<UINT32_MAX判斷,因為a+b已經(jīng)溢出了,判斷已經(jīng)沒有意義了*/
    if ((UINT32_MAX - a) < b)
    {
        //error 
    }
    
    return a + b;
}

//計算兩個值的乘積
uint32_t mul(uint32_t a, uint32_t b)
{
    /*先判斷乘積以后是否會溢出
    注意這里不能用 (a*b)<UINT32_MAX判斷,因為a*b已經(jīng)溢出了,判斷已經(jīng)沒有意義了*/
    if ((UINT32_MAX / a) < b)
    {
        //error
    }
    
    return a * b
}
類型的符號

C語言的整型數(shù)據(jù)類型都包含符號修飾符:signed (有符號)或者unsigned(無符號),但是符號修飾符并不影響數(shù)據(jù)真實的值,比如我們定義如下值:

signed char a = -1
unsigned char b = (signed char)a;

從內(nèi)存的內(nèi)容來講,a的內(nèi)存和b的內(nèi)存是一致的,都是11111111,沒什么區(qū)別,但是符號修飾符會影響邏輯判斷的結(jié)果,比如雖然這兩個值在內(nèi)存上沒什么區(qū)別,但是如果下比較會返回相反的結(jié)果:

signed char a = -1
unsigned char b = (signed char)a;

//成立
if (a < 0)
{
    printf("a < 0\n");
}

//成立
if (b > 0)
{
    printf("b > 0\n");
}

除了符號會影響邏輯判斷之外,C語言的默認(rèn)轉(zhuǎn)換也會影響邏輯判斷的結(jié)果,如下面的比較在不同的情況下,結(jié)果就不同

signed char a = -1
unsigned char b = (signed char)a;

//不成立,a沒有轉(zhuǎn)換為`unsigned char`
if (a > (unsigned char)0)
{
    printf("unsigned char a > 0\n");
}

//不成立,a沒有轉(zhuǎn)換為`unsigned short`
if (a > (unsigned short)0)
{
    printf("unsigned char a > 0\n");
}

//成立,a轉(zhuǎn)換為`unsigned int`
if (a > (unsigned int)0)
{
    printf("unsigned int a > 0\n");
}

上述就是小編為大家分享的C語言中有哪些類型了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI