0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言里的整數(shù)數(shù)據(jù)類(lèi)型

科技綠洲 ? 來(lái)源:網(wǎng)絡(luò)整理 ? 作者:網(wǎng)絡(luò)整理 ? 2023-11-24 16:09 ? 次閱讀

1. 整型數(shù)據(jù)類(lèi)型

C語(yǔ)言里面的整數(shù)數(shù)據(jù)類(lèi)型

類(lèi)型名稱(chēng)C語(yǔ)言中的關(guān)鍵字注釋
字符型char表示一個(gè)很小的整數(shù)
短整型short表示一個(gè)不怎么大的整數(shù)
整型int生活中一般的整數(shù)都可以表示
長(zhǎng)整型long較大的整數(shù)
加長(zhǎng)整型long long非常大的整數(shù)

一個(gè)整數(shù)而已,為什么會(huì)需要定義這么多不同的類(lèi)型出來(lái)呢?

計(jì)算機(jī)通過(guò)晶體管的開(kāi)關(guān)狀態(tài)來(lái)記錄數(shù)據(jù)。它們通常8個(gè)編為一組,我們稱(chēng)之為 字節(jié) 。而晶體管有開(kāi)關(guān)兩種狀態(tài),一個(gè)字節(jié)有8個(gè)晶體管,因此一個(gè)字節(jié)可以擁有2的八次方個(gè)不同的狀態(tài)。讓每一種狀態(tài)對(duì)應(yīng)一個(gè)數(shù)值,這樣一個(gè)字節(jié)可以表示256個(gè)不同數(shù)值。

晶體管狀態(tài)二進(jìn)制數(shù)值十進(jìn)制數(shù)值
關(guān)關(guān)關(guān)關(guān)關(guān)關(guān)關(guān)關(guān)000000000
關(guān)關(guān)關(guān)關(guān)關(guān)關(guān)關(guān)開(kāi)000000011
關(guān)關(guān)關(guān)關(guān)關(guān)關(guān)開(kāi)關(guān)000000102
關(guān)關(guān)關(guān)關(guān)關(guān)關(guān)開(kāi)開(kāi)000000113
開(kāi)關(guān)開(kāi)關(guān)開(kāi)關(guān)開(kāi)關(guān)10101010170
開(kāi)開(kāi)開(kāi)開(kāi)開(kāi)開(kāi)開(kāi)開(kāi)11111111255

要表示更大的數(shù)據(jù)范圍就需要更多晶體管。要知道在發(fā)明C語(yǔ)言的年代,計(jì)算機(jī)存儲(chǔ)資源是非常珍貴而稀缺的。如果只想表達(dá)0到100以?xún)?nèi)的數(shù)值,那么一個(gè)字節(jié)就足夠了,何必用兩個(gè)字節(jié)來(lái)存儲(chǔ)?

而如今,即使存儲(chǔ)資源已經(jīng)較為豐富了,但是大部分的強(qiáng)類(lèi)型語(yǔ)言,都延續(xù)了這個(gè)傳統(tǒng)。它們均提供了豐富的類(lèi)型以供選用。而程序員在編寫(xiě)代碼時(shí),通常能預(yù)想到需要使用到的數(shù)據(jù)范圍的大小。這樣在處理一個(gè)數(shù)據(jù)時(shí),可以從語(yǔ)言所提供的類(lèi)型中選用最合適的類(lèi)型來(lái)承載數(shù)據(jù)。

在C語(yǔ)言標(biāo)準(zhǔn)并未規(guī)定這些數(shù)據(jù)類(lèi)型的大小范圍,具體的實(shí)現(xiàn)交由了編譯器和平臺(tái)決定。

2. 用sizeof關(guān)鍵詞來(lái)測(cè)量大小

int一樣,sizeof是C語(yǔ)言中的一個(gè)關(guān)鍵詞。它是英文size of連起來(lái)的合成詞。翻譯成中文就是什么東西的大小的意思。它能夠測(cè)量C語(yǔ)言各種實(shí)體所占用的字節(jié)大小。

如果我們想看int所占用的字節(jié)大小,可以這樣寫(xiě)sizeof(int)。執(zhí)行后這段代碼后,它的測(cè)量結(jié)果是一個(gè)整型。我們可以借助printf函數(shù)將測(cè)量結(jié)果顯示在控制臺(tái)上。我們現(xiàn)在可以假設(shè)sizeof返回的結(jié)果是int類(lèi)型的,在printf函數(shù)中使用占位符%d。而更準(zhǔn)確的用法,應(yīng)該用%zu。

測(cè)量int類(lèi)型所占用的字節(jié)大小,并將結(jié)果打印在控制臺(tái)上的代碼如下:

printf("%dn", sizeof(int));

sizeof后面既可以跟 類(lèi)型,也可以跟 變量、常量。

  1. 類(lèi)型 ,測(cè)類(lèi)型所占用字節(jié)的大小。
  2. 變量 ,測(cè)變量的類(lèi)型所占用字節(jié)大小。
  3. 常量 ,測(cè)常量的類(lèi)型所占用字節(jié)大小。

三種情況的示例代碼。

int a; 
printf("sizeof int = %dn", sizeof(int)); // 1.測(cè)類(lèi)型所占用字節(jié)的大小 
printf("sizeof a = %dn", sizeof(a)); // 1.測(cè)變量的類(lèi)型所占用字節(jié)大小 
printf("sizeof 123 = %dn", sizeof(123)); // 1.測(cè)常量的類(lèi)型所占用字節(jié)大小

測(cè)試C語(yǔ)言提供的各種整型類(lèi)型的大小

printf("sizeof char=%dn", sizeof(char));
printf("sizeof short=%dn", sizeof(short)); 
printf("sizeof int=%dn", sizeof(int));
printf("sizeof long=%dn", sizeof(long));
printf("sizeof long long=%dn", sizeof(longlong));

圖片結(jié)果:char,short,int,long,long long分別占用了1,2,4,4,8個(gè)字節(jié)。至此,我們已經(jīng)得知了它們所占字節(jié)大小,并且驗(yàn)證了可以表示越大范圍的數(shù)據(jù)類(lèi)型所占用的字節(jié)越多。值得注意的是intlong均占用4個(gè)字節(jié)。這并未違反C語(yǔ)言標(biāo)準(zhǔn),C語(yǔ)言標(biāo)準(zhǔn)規(guī)定高級(jí)別的類(lèi)型取值范圍不得小于低級(jí)別的類(lèi)型,但是它們可以是一致的。

3. 三位二進(jìn)制表示的數(shù)值范圍

char,short,int,long,long long分別占用了1,2,4,4,8個(gè)字節(jié)。而每個(gè)字節(jié)由8個(gè)晶體管組成,每個(gè)晶體管狀態(tài)我們稱(chēng)之為位。那么char,short,intlong,long long分別占用了8,16,32,32,64位。

太多的位不利于理解原理,暫時(shí)把問(wèn)題簡(jiǎn)化一下,試試看位數(shù)減少到3。然后,分析3位的組 合,它能表示多大范圍的數(shù)值.

晶體管狀態(tài)二進(jìn)制數(shù)據(jù)十進(jìn)制數(shù)據(jù)
關(guān)關(guān)關(guān)0000
關(guān)關(guān)開(kāi)0011
關(guān)開(kāi)關(guān)0102
關(guān)開(kāi)開(kāi)0113
開(kāi)關(guān)關(guān)1004
開(kāi)關(guān)開(kāi)1015
開(kāi)開(kāi)關(guān)1106
開(kāi)開(kāi)開(kāi)1117

三位二進(jìn)制組成的數(shù)據(jù)類(lèi)型,可以表達(dá)2的3次方也就是8個(gè)數(shù)值。如果從0開(kāi)始,那么可以表達(dá)從0到7的 數(shù)據(jù)范圍。 得出結(jié)論 :如果不考慮負(fù)數(shù),那么整型數(shù)據(jù)類(lèi)型可以表達(dá)的數(shù)據(jù)范圍是 假設(shè),位數(shù)為n,則數(shù)據(jù)范圍從【0】開(kāi)始,到【2的n次方-1】的數(shù)值范圍。

負(fù)數(shù)怎么辦?我們需要 拿出一個(gè)位來(lái)作為符號(hào)位 。用來(lái)表示這個(gè)數(shù)據(jù)是正數(shù)還是負(fù)數(shù)。在IEEE標(biāo)準(zhǔn)中,這個(gè)符號(hào)位存在于二進(jìn)制的最高位。用三位二進(jìn)制來(lái)示范這種情況。

晶體管狀態(tài)二進(jìn)制數(shù)據(jù)十進(jìn)制數(shù)據(jù)
關(guān)關(guān)關(guān)0000
關(guān)關(guān)開(kāi)0011
關(guān)開(kāi)關(guān)0102
關(guān)開(kāi)開(kāi)0113
開(kāi)關(guān)關(guān)100-4
開(kāi)關(guān)開(kāi)101-3
開(kāi)開(kāi)關(guān)110-2
開(kāi)開(kāi)開(kāi)111-1

加上符號(hào)之后,現(xiàn)在取值范圍變?yōu)樨?fù)4到3了。紅色字體的為最高位,最高位為1的表示負(fù)數(shù)。你可能會(huì)覺(jué)得有點(diǎn)奇怪,為什么3的二進(jìn)制是011,而負(fù)3卻是101呢?如果簡(jiǎn)單的加一個(gè)符號(hào)位,為什么不用111呢?那我們看看如圖中所示的3與負(fù)3相加的運(yùn)算結(jié)果。

圖片

會(huì)驚奇地發(fā)現(xiàn),用101來(lái)表示負(fù)3與用011表示的正3相加。結(jié)果為1000,但是由于僅有3位二進(jìn)制來(lái)保 存數(shù)據(jù),最高位1被丟棄了。結(jié)果為000,居然得到了正確的結(jié)果0。

4.數(shù)值的補(bǔ)碼表示法

時(shí)鐘是一個(gè)圓被分成了12個(gè)點(diǎn),讓我們假設(shè)這個(gè)時(shí)鐘一步只能走一個(gè)整點(diǎn)。那么這個(gè)時(shí)鐘只有12種不同的模式,我們把12稱(chēng)之為時(shí)鐘的模。

現(xiàn)在指針指向了5點(diǎn),我們要讓指針回到0點(diǎn)。一個(gè)辦法是直接回退5個(gè)小時(shí)(5-5)。另一個(gè)辦法是繼續(xù)往前走7個(gè)小時(shí)(5+7)。

在第二種辦法中,5+7=12,而12剛好為時(shí)鐘的模,時(shí)鐘指向12的同時(shí),也正好指向了0。要讓指針回到0點(diǎn),只需要讓它加上模與當(dāng)前的時(shí)間的差即可。

因此,指針回退5小時(shí)與指針前進(jìn)7小時(shí)是等價(jià)的。我們可以用指針前進(jìn)來(lái)代替指針后退。

將這種思想帶入到上面討論的三位二進(jìn)制當(dāng)中。三位二進(jìn)制能表示8中不同的模式,因此它的 模 為8。要讓3回到0,我們可以讓3減去3,也可以讓3加上 模與3的差,即8-3=5。因此,我們可以把-3在三位二進(jìn)制中用5的二進(jìn)制101表示。

這種將用加法來(lái)等效減法的二進(jìn)制表示法被稱(chēng)之為補(bǔ)碼表示法。

正數(shù)的補(bǔ)碼就是其二進(jìn)制本身。而正數(shù)對(duì)應(yīng)的負(fù)數(shù)的補(bǔ)碼為:(模 - 正數(shù))的二進(jìn)制。

0000
0011
0102
負(fù)數(shù)模減去正數(shù)補(bǔ)碼0113
-48-4=4100100-4
-38-3=5101101-3
-28-2=6110110-2
-18-1=7111111-1

補(bǔ)碼表示法既通過(guò)最高位,區(qū)別了正數(shù)和負(fù)數(shù)。并且,巧妙地應(yīng)用了溢出,所得到的計(jì)算結(jié)果也是正確的。類(lèi)似于鐘表僅需要向前走就可以實(shí)現(xiàn)減法,計(jì)算機(jī)的電路設(shè)計(jì)中,也只需要設(shè)計(jì)加法電路。極大地簡(jiǎn)化了計(jì)算機(jī)內(nèi)部電路的復(fù)雜程度。

求一個(gè)正數(shù)對(duì)應(yīng)的負(fù)數(shù)的補(bǔ)碼的第二種辦法:

  1. 先寫(xiě)出這個(gè)正數(shù)的二進(jìn)制。
  2. 從二進(jìn)制的右邊開(kāi)始,遇到第一個(gè)1之前,全都填0。
  3. 遇到第一個(gè)1之后,把1填下來(lái)。
  4. 1之后的全部取反。

從右往左:未遇到1填0,遇到1填1,然后全部取反

十進(jìn)制0-1-2-3-4
整數(shù)二進(jìn)制000001010011100
補(bǔ)碼000111110101100

5.各種整型類(lèi)型的數(shù)值范圍是多少

類(lèi)型sizeof大小二進(jìn)制位數(shù)取值范圍算式取值范圍
char11×8 = 8位-[2的7次方] ~ +[2的七次方 - 1]-128 ~ +127
short22×8 = 16位-[2的15次方] ~ +[2的15次方 - 1]-32,768 ~ +32,767
int44×8 = 32位-[2的31次方] ~ +[2的31次方 - 1]-2,147,483,648 ~ +2,147,483,647
long44×8 = 32位-[2的31次方] ~ +[2的31次方 - 1]-2,147,483,648 ~ +2,147,483,647
long long88×8 = 64位-[2的63次方] ~ +[2的63次方 - 1]-9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807

次方數(shù)比位數(shù)少一,是因?yàn)樽罡呶槐挥萌プ龇?hào)位了。

6. 無(wú)符號(hào)整型

如果你確定你不會(huì)用到負(fù)數(shù),那么請(qǐng)使用unsigned關(guān)鍵詞。表明這個(gè)數(shù)據(jù)類(lèi)型,是不帶有符號(hào)位的。既然不帶有符號(hào)位了,那么原本留給符號(hào)位的那一個(gè)二進(jìn)制位,可以用來(lái)表示數(shù)值。

類(lèi)型sizeof大小二進(jìn)制位數(shù)取值訪(fǎng)問(wèn)算式取值范圍
unsigned char11×8 = 8位0 ~ +[2的8次方 - 1]0 ~ +255
unsigned short22×8 = 16位0 ~ +[2的16次方 - 1]0 ~ +65,535
unsigned int44×8 = 32位0 ~ +[2的32次方 - 1]0 ~ +4,294,967,295
unsigned long44×8 = 32位0 ~ +[2的32次方 - 1]0 ~ +4,294,967,295
unsigned long long88×8 = 64位0 ~ +[2的64次方 - 1]0 ~ +18,446,744,073,709,551,615
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4226

    瀏覽量

    85575
  • 晶體管
    +關(guān)注

    關(guān)注

    77

    文章

    9609

    瀏覽量

    137655
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7594

    瀏覽量

    135858
  • 數(shù)據(jù)類(lèi)型

    關(guān)注

    0

    文章

    236

    瀏覽量

    13596
  • 整數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    6486
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言中的基本數(shù)據(jù)類(lèi)型

    C語(yǔ)言是非常重要的一門(mén)程序設(shè)計(jì)語(yǔ)言,學(xué)好C語(yǔ)言再去學(xué)習(xí)其他編程語(yǔ)言將變得很輕松,因?yàn)榇蟛糠?/div>
    發(fā)表于 04-26 17:33 ?1952次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>中的基本<b class='flag-5'>數(shù)據(jù)類(lèi)型</b>

    C語(yǔ)言中基本數(shù)據(jù)類(lèi)型、變量和常量的使用

    C語(yǔ)言中基本數(shù)據(jù)類(lèi)型、變量和常量的使用
    發(fā)表于 08-18 16:42 ?2444次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>中基本<b class='flag-5'>數(shù)據(jù)類(lèi)型</b>、變量和常量的使用

    技術(shù)干貨驛站 ▏深入理解C語(yǔ)言:基本數(shù)據(jù)類(lèi)型和變量

    C語(yǔ)言中,數(shù)據(jù)類(lèi)型和變量是編程的基礎(chǔ),也是理解更復(fù)雜概念的關(guān)鍵。數(shù)據(jù)類(lèi)型決定了變量的內(nèi)存分配、存儲(chǔ)范圍和操作方式,而變量則是存儲(chǔ)數(shù)據(jù)的容器
    的頭像 發(fā)表于 07-26 17:53 ?1856次閱讀
    技術(shù)干貨驛站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:基本<b class='flag-5'>數(shù)據(jù)類(lèi)型</b>和變量

    Python中常用的數(shù)據(jù)類(lèi)型

    數(shù)據(jù)類(lèi)型是每種編程語(yǔ)言必備屬性,只有給數(shù)據(jù)賦予明確的數(shù)據(jù)類(lèi)型,計(jì)算機(jī)才能對(duì)數(shù)據(jù)進(jìn)行處理運(yùn)算,因此,正確使用
    發(fā)表于 04-19 15:14

    FPGA中的VHDL語(yǔ)言數(shù)據(jù)類(lèi)型和運(yùn)算符

    VHDL 和其他高級(jí)語(yǔ)言一樣,具有多種數(shù)據(jù)類(lèi)型。對(duì)大多數(shù)數(shù)據(jù)類(lèi)型的定義兩者是一致的(例如整數(shù)型),但是也有一些數(shù)據(jù)類(lèi)型是 VHDL 所獨(dú)有的
    發(fā)表于 09-10 10:09

    C語(yǔ)言數(shù)據(jù)類(lèi)型有哪些?

    C語(yǔ)言數(shù)據(jù)類(lèi)型(基礎(chǔ)類(lèi)型+結(jié)構(gòu)體)
    發(fā)表于 12-25 07:06

    C預(yù)處理與C語(yǔ)言基本數(shù)據(jù)類(lèi)型

    指令表:注意:宏名的書(shū)寫(xiě)由標(biāo)識(shí)符與兩邊各兩條下劃線(xiàn)構(gòu)成。C語(yǔ)言基本數(shù)據(jù)類(lèi)型不同操作系統(tǒng)中數(shù)據(jù)類(lèi)型所占字節(jié)數(shù)圖解數(shù)據(jù)類(lèi)型的其他分類(lèi):變量常量(
    發(fā)表于 12-21 08:29

    淺析System Verilog中的整數(shù)數(shù)據(jù)類(lèi)型

    ,從此大一統(tǒng)。另外,追隨潮流。SystemVerilog還支持了面向?qū)ο蟮奶匦?,以支撐功能?yàn)證環(huán)境的模塊化和可重用需求。Integer Data Types整數(shù)數(shù)據(jù)類(lèi)型可以不同維度進(jìn)行劃分
    發(fā)表于 10-11 14:15

    C程序的運(yùn)行環(huán)境和C語(yǔ)言數(shù)據(jù)類(lèi)型

    ⒈ 實(shí)驗(yàn)?zāi)康蘑?了解在具體的語(yǔ)言環(huán)境下如何編輯、編譯、連接和運(yùn)行一個(gè)C程序。⑵ 通過(guò)運(yùn)行簡(jiǎn)單的C程序,初步了解C源程序的特點(diǎn)。⑶ 掌握C
    發(fā)表于 06-21 09:36 ?55次下載

    C語(yǔ)言數(shù)據(jù)儲(chǔ)存與數(shù)據(jù)類(lèi)型類(lèi)型轉(zhuǎn)換的詳細(xì)資料說(shuō)明

    程序說(shuō)到底就是對(duì)數(shù)據(jù)的處理,所以首先要弄清楚需要處理哪些數(shù)據(jù),計(jì)算機(jī)如何存儲(chǔ)這些數(shù)據(jù)。C語(yǔ)言根據(jù)需要,抽象出了一些基本
    的頭像 發(fā)表于 02-24 15:39 ?3921次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>數(shù)據(jù)</b>儲(chǔ)存與<b class='flag-5'>數(shù)據(jù)類(lèi)型</b>及<b class='flag-5'>類(lèi)型</b>轉(zhuǎn)換的詳細(xì)資料說(shuō)明

    C語(yǔ)言-基本數(shù)據(jù)類(lèi)型與位運(yùn)算

    這篇文章作為基礎(chǔ)知識(shí)點(diǎn),總結(jié)C語(yǔ)言的基本數(shù)據(jù)類(lèi)型有哪些,浮點(diǎn)數(shù)的精度,整數(shù)變量的空間范圍,變量定義語(yǔ)法,變量命名規(guī)則,浮點(diǎn)數(shù)打印格式,基本數(shù)據(jù)類(lèi)型
    的頭像 發(fā)表于 08-14 09:56 ?1523次閱讀

    C語(yǔ)言數(shù)據(jù)類(lèi)型-2

    對(duì)于一個(gè)計(jì)算機(jī)程序,它所做的所有運(yùn)算的本質(zhì)都是數(shù)據(jù)的處理。但是數(shù)據(jù)的樣式并不單一,因此就有了各種各樣的數(shù)據(jù)類(lèi)型。在C語(yǔ)言中,為了處理這些復(fù)雜
    的頭像 發(fā)表于 02-21 14:44 ?748次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>數(shù)據(jù)類(lèi)型</b>-2

    基本數(shù)據(jù)類(lèi)型分享

    基本數(shù)據(jù)類(lèi)型 基本數(shù)據(jù)類(lèi)型:包括位、位序列、整數(shù)、浮點(diǎn)數(shù)、日期時(shí)間。此外字符也屬于基本數(shù)據(jù)類(lèi)型,請(qǐng)參見(jiàn)文檔String與WString。 1.位和位序列 2.
    的頭像 發(fā)表于 06-13 14:14 ?9201次閱讀
    基本<b class='flag-5'>數(shù)據(jù)類(lèi)型</b>分享

    plc數(shù)據(jù)類(lèi)型怎么理解和應(yīng)用

    的PLC程序的關(guān)鍵。 PLC數(shù)據(jù)類(lèi)型的基本理解 PLC數(shù)據(jù)類(lèi)型是指用于存儲(chǔ)和表示數(shù)據(jù)的方式,它們可以區(qū)分為不同類(lèi)型數(shù)據(jù)元素。根據(jù)
    的頭像 發(fā)表于 12-19 11:39 ?3904次閱讀

    C語(yǔ)言數(shù)據(jù)類(lèi)型有哪些

    C 語(yǔ)言中,數(shù)據(jù)類(lèi)型指的是用于聲明不同類(lèi)型的變量或函數(shù)的一個(gè)廣泛的系統(tǒng)。變量的類(lèi)型決定了變量存儲(chǔ)占用的空間,以及如何解釋存儲(chǔ)的位模式。
    發(fā)表于 03-20 10:56 ?423次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>數(shù)據(jù)類(lèi)型</b>有哪些