最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言之整數(shù)存儲(chǔ)底層邏輯用法解讀

 更新時(shí)間:2026年04月22日 09:05:25   作者:碼完就睡  
本文主要介紹了原碼、反碼、補(bǔ)碼的概念,以及計(jì)算機(jī)中整數(shù)的存儲(chǔ)規(guī)則,解釋了不同整數(shù)類(lèi)型的范圍和表示方式,同時(shí)對(duì)有符號(hào)和無(wú)符號(hào)整數(shù)類(lèi)型進(jìn)行了區(qū)分和對(duì)比,最后介紹了相同字節(jié)大小轉(zhuǎn)換和不同字節(jié)大小轉(zhuǎn)換的方法

一、原碼 反碼 補(bǔ)碼

1.原碼

二進(jìn)制表示法。最高位為符號(hào)位,表示正負(fù);剩下位為數(shù)值位,表示數(shù)值大小。

例如(以8位舉例):

  • 10的原碼:00001010
  • -10的原碼:10001010

2.反碼

符號(hào)位不變,其余位取反。

例如(以8位舉例):

  • 10的反碼:00001010
  • -10的反碼:11110101

正數(shù)的反碼=原碼

3.補(bǔ)碼

反碼+1。

例如(以8位舉例):

  • 10的補(bǔ)碼:00001010
  • -10的補(bǔ)碼:11110110

正數(shù):原碼、反碼、補(bǔ)碼都相等

負(fù)數(shù):

        原碼 -> 補(bǔ)碼:符號(hào)位不變,其余位取反;+1

        補(bǔ)碼 -> 原碼:

                方法一:-1;符號(hào)位不變,其余位取反

                方法二:符號(hào)位不變,其余位取反;+1

二、整數(shù)存儲(chǔ)

1.計(jì)算機(jī)中的原反補(bǔ)規(guī)則

所有的整型數(shù)據(jù)在計(jì)算機(jī)中都已補(bǔ)碼的形式存儲(chǔ)和運(yùn)算。

計(jì)算機(jī)在處理整型數(shù)據(jù)時(shí),會(huì)先將其看作int類(lèi)型進(jìn)行處理;若超出int類(lèi)型的范圍,則將其看作long long型進(jìn)行處理。

例如:

char a = -10;

計(jì)算機(jī)首先申請(qǐng)了1個(gè)字節(jié)的空間,并將這篇空間命名為a;-10的補(bǔ)碼為11111111 11111111 11111111 11110110,將這個(gè)補(bǔ)碼存入a這片空間,因?yàn)閍只有1個(gè)字節(jié),所以只能存入最后一個(gè)字節(jié),即11110110。

char b = 10;

計(jì)算機(jī)首先申請(qǐng)了1個(gè)字節(jié)的空間,并將這篇空間命名為b;10的補(bǔ)碼為00000000 00000000 00000000 00001010,將這個(gè)補(bǔ)碼存入a這片空間,因?yàn)閍只有1個(gè)字節(jié),所以只能存入最后一個(gè)字節(jié),即00001010。

2.有符號(hào)/無(wú)符號(hào)整數(shù)類(lèi)型

在計(jì)算機(jī)中,char/short/int/long/long long屬于有符號(hào)(signed)的整數(shù)類(lèi)型,此外,計(jì)算機(jī)中還提供了一種無(wú)符號(hào)(unsigned)的整數(shù)類(lèi)型。

類(lèi)型格式控制符比特位使用規(guī)則大?。˙yte)范圍特殊值
有符號(hào)(signed可寫(xiě)可不寫(xiě))的整數(shù)家族
char%hhd/%c1位符號(hào)位 7位數(shù)值位1Byte-2^7~2^7-110000000(-2^7)
short%hd1位符號(hào)位 15位數(shù)值位2Byte-2^15~2^15-110000000 00000000(-2^15)
int%d1位符號(hào)位 31位數(shù)值位4Byte-2^31~2^31-110000000 00000000 00000000 00000000(-2^31)
long%ld1位符號(hào)位 31位數(shù)值位4Byte-2^31~2^31-1

10000000 00000000 00000000 00000000

(-2^31)

long long%lld1位符號(hào)位 63位數(shù)值位8Byte-2^63~2^63-1

10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000(-2^63)

無(wú)符號(hào)(unsigned)的整數(shù)家族
unsigned char%hhu8位數(shù)值位1Byte0~2^8
unsigned short%hu16位數(shù)值位2Byte0~2^16
unsigned int%u32位數(shù)值位4Byte0~2^32
unsigned long%lu32位數(shù)值位4Byte0~2^64
unsigned long long%llu64位數(shù)值位8Byte0~2^64

以char為例:

char(1位符號(hào)位 7位數(shù)值位)數(shù)值unsigned char(8位數(shù)值位)數(shù)值
0 111111112701111111127
0 111111012601111110126
............
0 00000011000000011
0 00000000000000000
1 0000000-12810000000128
1 0000001-110000001129
1 0000010-210000010130
............
1 1111110-1261 1111110254
1 1111111-12711111111255
char1個(gè)符號(hào)位+7個(gè)數(shù)值位最大值 127(0 1111111)最小值 -128(1 1111111)
unsigned char8個(gè)數(shù)值位最大值 255(11111111)最小值 0(00000000)
  • 因?yàn)?strong>char類(lèi)型中10000000沒(méi)有別的數(shù)可以表示,計(jì)算機(jī)強(qiáng)制規(guī)定它為最小值-2^7(-128)。
  • 同理,short類(lèi)型中,計(jì)算機(jī)強(qiáng)制規(guī)定10000000 00000000為最小值-2^15;
  • intlong類(lèi)型中,計(jì)算機(jī)強(qiáng)制規(guī)定10000000 00000000 00000000 00000000為最小值-2^31
  • long long類(lèi)型中,計(jì)算機(jī)強(qiáng)制規(guī)定10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000為最小值-2^63;

3.相同字節(jié)大小轉(zhuǎn)換

int main() {
    //-10的原碼:10000000 00000000 00000000 00001010
    //-10的反碼:11111111 11111111 11111111 11110101
    //-10的補(bǔ)碼:11111111 11111111 11111111 11110110
	char a = -10;           //只有一個(gè)字節(jié)的空間,只能存放下最后一個(gè)字節(jié):11110110
	unsigned char b = -10;  //只有一個(gè)字節(jié)的空間,只能存放下最后一個(gè)字節(jié):11110110

	printf("a=%hhd,b=%hhd\n", a, b);
    /*
    a:11110110
    1.按照%hhd(有符號(hào)char類(lèi)型)的格式輸出,所以要將11110110看作是1個(gè)符號(hào)位+7個(gè)數(shù)值位
    2.將補(bǔ)碼轉(zhuǎn)換成原碼:11110110->10001010
      (符號(hào)位是1,為負(fù)數(shù);負(fù)數(shù)的原碼=補(bǔ)碼-1,再符號(hào)位不變,其余位取反)
    3.將原碼轉(zhuǎn)換成十進(jìn)制:10001010->-10

    b:11110110
    1.按照%hhd(有符號(hào)char類(lèi)型)的格式輸出,所以要將11110110看作是1個(gè)符號(hào)位+7個(gè)數(shù)值位
    2.將補(bǔ)碼轉(zhuǎn)換成原碼:11110110->10001010
    (符號(hào)位是1,為負(fù)數(shù);負(fù)數(shù)的原碼=補(bǔ)碼-1,再符號(hào)位不變,其余位取反)
    3.將原碼轉(zhuǎn)換成十進(jìn)制:10001010->-10
    */
         
	printf("a=%hhu,b=%hhu\n", a, b);
    /*
    a:11110110
    1.按照%hhu(無(wú)符號(hào)char類(lèi)型)的格式輸出,所以要將11110110看作是8個(gè)數(shù)值位
    2.將補(bǔ)碼轉(zhuǎn)換成原碼:11110110->10001010(正數(shù)的原碼、反碼、補(bǔ)碼相同)
    3.將原碼轉(zhuǎn)換成十進(jìn)制:10001010->138

    b:11110110
    1.按照%hhu(無(wú)符號(hào)char類(lèi)型)的格式輸出,所以要將11110110看作是8個(gè)數(shù)值位
    2.將補(bǔ)碼轉(zhuǎn)換成原碼:11110110->10001010(正數(shù)的原碼、反碼、補(bǔ)碼相同)
    3.將原碼轉(zhuǎn)換成十進(jìn)制:10001010->138
    */

    return 0;
}

4.不同字節(jié)大小轉(zhuǎn)換

(1)小字節(jié)轉(zhuǎn)大字節(jié)

符號(hào)位不變,數(shù)值位不變,其余位補(bǔ)符號(hào)位的數(shù)字。

int main() {
    //-10的原碼:10000000 00000000 00000000 00001010
    //-10的反碼:11111111 11111111 11111111 11110101
    //-10的補(bǔ)碼:11111111 11111111 11111111 11110110
	char a = -10;           //只有一個(gè)字節(jié)的空間,只能存放下最后一個(gè)字節(jié):11110110
	unsigned char b = -10;  //只有一個(gè)字節(jié)的空間,只能存放下最后一個(gè)字節(jié):11110110

	printf("a=%hd,b=%hd\n", a, b);
    /*
    a:11110110 -> a的類(lèi)型是有符號(hào)char類(lèi)型,符號(hào)位:1
    1.按照%hd(有符號(hào)short類(lèi)型)的格式輸出,所以要先將11110110擴(kuò)充為2個(gè)字節(jié):
      11110110->11111111 11110110
      (符號(hào)位不變,數(shù)值位不變,其余位補(bǔ)符號(hào)位的數(shù)字,即補(bǔ)1)
    2.將11111111 11110110看作是1個(gè)符號(hào)位+15個(gè)數(shù)值位
    3.將補(bǔ)碼轉(zhuǎn)換成原碼:11111111 11110110->10000000 00001010
      (符號(hào)位是1,為負(fù)數(shù);負(fù)數(shù)的原碼=補(bǔ)碼-1,再符號(hào)位不變,其余位取反)
    4.將原碼轉(zhuǎn)換成十進(jìn)制:10000000 00001010->-10

    b:11110110 -> b的類(lèi)型是無(wú)符號(hào)char類(lèi)型,符號(hào)位:0
    1.按照%hd(有符號(hào)short類(lèi)型)的格式輸出,所以要先將11110110擴(kuò)充為2個(gè)字節(jié):
      11110110->00000000 11110110
      (符號(hào)位不變,數(shù)值位不變,其余位補(bǔ)符號(hào)位的數(shù)字,即補(bǔ)1)
    2.將00000000 11110110看作是1個(gè)符號(hào)位+15個(gè)數(shù)值位
    3.將補(bǔ)碼轉(zhuǎn)換成原碼:00000000 11110110->00000000 11110110
      (符號(hào)位是0,為正數(shù);正數(shù)的原碼、反碼、補(bǔ)碼相同)
    4.將原碼轉(zhuǎn)換成十進(jìn)制:00000000 11110110->246
    */    

	printf("a=%hu,b=%hu\n", a, b);
    /*
    a:11110110 -> a的類(lèi)型是有符號(hào)char類(lèi)型,符號(hào)位:1
    1.按照%hu(無(wú)符號(hào)short類(lèi)型)的格式輸出,所以要先將11110110擴(kuò)充為2個(gè)字節(jié):
      11110110->11111111 11110110
      (符號(hào)位不變,數(shù)值位不變,其余位補(bǔ)符號(hào)位的數(shù)字,即補(bǔ)0)
    2.將11111111 11110110看作是16個(gè)數(shù)值位
    3.將補(bǔ)碼轉(zhuǎn)換成原碼:11111111 11110110->11111111 11110110
      (正數(shù)的原碼、反碼、補(bǔ)碼相同)
    4.將原碼轉(zhuǎn)換成十進(jìn)制:11111111 11110110->65526

    b:11110110 -> b的類(lèi)型是無(wú)符號(hào)char類(lèi)型,符號(hào)位:0
    1.按照%hd(有符號(hào)short類(lèi)型)的格式輸出,所以要先將11110110擴(kuò)充為2個(gè)字節(jié):
      11110110->00000000 11110110
      (符號(hào)位不變,數(shù)值位不變,其余位補(bǔ)符號(hào)位的數(shù)字,即補(bǔ)0)
    2.將00000000 11110110看作是16個(gè)數(shù)值位
    3.將補(bǔ)碼轉(zhuǎn)換成原碼:00000000 11110110->00000000 11110110
      (正數(shù)的原碼、反碼、補(bǔ)碼相同)
    4.將原碼轉(zhuǎn)換成十進(jìn)制:00000000 11110110->246
    */    

    return 0;
}

(2)大字節(jié)轉(zhuǎn)小字節(jié)

直接強(qiáng)行截取。

int main() {
    //-10的原碼:10000000 00000000 00000000 00001010
    //-10的反碼:11111111 11111111 11111111 11110101
    //-10的補(bǔ)碼:11111111 11111111 11111111 11110110

	short a = -10;           
    //只有兩個(gè)字節(jié)的空間,只能存放下最后兩個(gè)字節(jié):11111111 11110110
	unsigned short b = -10;  
    //只有兩個(gè)字節(jié)的空間,只能存放下最后兩個(gè)字節(jié):11111111 11110110

	printf("a=%hhd,b=%hhd\n", a, b);
    /*
    a:11111111 11110110
    1.按照%hhd(有符號(hào)char類(lèi)型)的格式輸出,所以要先將11111111 11110110截取為1個(gè)字節(jié):
      11111111 11110110->11110110
    2.將11110110看作是1個(gè)符號(hào)位+7個(gè)數(shù)值位
    3.將補(bǔ)碼轉(zhuǎn)換成原碼:11110110->10001010
      (符號(hào)位是1,為負(fù)數(shù);負(fù)數(shù)的原碼=補(bǔ)碼-1,再符號(hào)位不變,其余位取反)
    4.將原碼轉(zhuǎn)換成十進(jìn)制:10001010->-10

    b:11111111 11110110
    1.按照%hhd(有符號(hào)char類(lèi)型)的格式輸出,所以要先將11111111 11110110截取為1個(gè)字節(jié):
      11111111 11110110->11110110
    2.將11110110看作是1個(gè)符號(hào)位+7個(gè)數(shù)值位
    3.將補(bǔ)碼轉(zhuǎn)換成原碼:11110110->10001010
      (符號(hào)位是1,為負(fù)數(shù);負(fù)數(shù)的原碼=補(bǔ)碼-1,再符號(hào)位不變,其余位取反)
    4.將原碼轉(zhuǎn)換成十進(jìn)制:10001010->-10
    */    

	printf("a=%hhu,b=%hhu\n", a, b);
    /*
    a:11110110
    1.按照%hhu(無(wú)符號(hào)char類(lèi)型)的格式輸出,所以要先將11111111 11110110截取為1個(gè)字節(jié):
      11111111 11110110->11110110
    2.將11110110看作是8個(gè)數(shù)值位
    3.將補(bǔ)碼轉(zhuǎn)換成原碼:11110110->11110110
      (正數(shù)的原碼、反碼、補(bǔ)碼相同)
    4.將原碼轉(zhuǎn)換成十進(jìn)制:11110110->246

    b:11110110
    1.按照%hhu(無(wú)符號(hào)char類(lèi)型)的格式輸出,所以要先將11111111 11110110截取為1個(gè)字節(jié):
      11111111 11110110->11110110
    2.將11110110看作是8個(gè)數(shù)值位
    3.將補(bǔ)碼轉(zhuǎn)換成原碼:11110110->11110110
      (正數(shù)的原碼、反碼、補(bǔ)碼相同)
    4.將原碼轉(zhuǎn)換成十進(jìn)制:11110110->246
    */    

    return 0;
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解C++中的左值,純右值和將亡值

    詳解C++中的左值,純右值和將亡值

    C++中本身是存在左值,右值的概念,但是在C11中又出現(xiàn)了左值,純右值,將亡值得概念;這里我們主要介紹這些值的概念,感興趣的可以了解一下
    2022-09-09
  • C語(yǔ)言容易被忽視的函數(shù)設(shè)計(jì)原則基礎(chǔ)

    C語(yǔ)言容易被忽視的函數(shù)設(shè)計(jì)原則基礎(chǔ)

    C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言.那么C語(yǔ)言函數(shù)設(shè)計(jì)的一般原則和技巧都是怎樣的呢,下面帶你了解
    2022-04-04
  • c++只保留float型的小數(shù)點(diǎn)后兩位問(wèn)題

    c++只保留float型的小數(shù)點(diǎn)后兩位問(wèn)題

    這篇文章主要介紹了c++只保留float型的小數(shù)點(diǎn)后兩位問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C#開(kāi)源類(lèi)庫(kù)SimpleTCP使用方法

    C#開(kāi)源類(lèi)庫(kù)SimpleTCP使用方法

    SimpleTCP內(nèi)部有一個(gè)特殊字符分割字符串的協(xié)議可以直接使用,也可以在DataReceived事件處理程序中實(shí)現(xiàn)自己的協(xié)議,這篇文章主要介紹了C#開(kāi)源類(lèi)庫(kù)SimpleTCP的使用方法,需要的朋友可以參考下
    2021-09-09
  • C++獲得其他程序窗體控件中信息的方法

    C++獲得其他程序窗體控件中信息的方法

    這篇文章主要介紹了C++獲得其他程序窗體控件中信息的方法,涉及windows控件句柄的獲取技巧,需要的朋友可以參考下
    2015-05-05
  • c++項(xiàng)目中后綴名vcxproj和sln的區(qū)別及說(shuō)明

    c++項(xiàng)目中后綴名vcxproj和sln的區(qū)別及說(shuō)明

    這篇文章主要介紹了c++項(xiàng)目中后綴名vcxproj和sln的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • C語(yǔ)言詳細(xì)分析講解流程控制語(yǔ)句用法

    C語(yǔ)言詳細(xì)分析講解流程控制語(yǔ)句用法

    C語(yǔ)言語(yǔ)句的執(zhí)行默認(rèn)順序執(zhí)行(從上往下依次執(zhí)行),編程語(yǔ)言一般除了默認(rèn)的順序執(zhí)行以外,還提供分支執(zhí)行和循環(huán)執(zhí)行的語(yǔ)法,讓我們一起來(lái)看看
    2022-05-05
  • C語(yǔ)言實(shí)現(xiàn)宿舍管理課程設(shè)計(jì)

    C語(yǔ)言實(shí)現(xiàn)宿舍管理課程設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)宿舍管理課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++11中std::function與std::bind的用法實(shí)例

    C++11中std::function與std::bind的用法實(shí)例

    大家都知道C++11中增加了許多的新特性,下面這篇文章主要給大家介紹了關(guān)于C++11中std::function與std::bind的用法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易停車(chē)場(chǎng)管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易停車(chē)場(chǎng)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易停車(chē)場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論

株洲市| 汤阴县| 隆尧县| 子洲县| 东平县| 阳江市| 马尔康县| 呼和浩特市| 大余县| 井陉县| 古浪县| 外汇| 炎陵县| 中方县| 凤凰县| 龙山县| 丽水市| 友谊县| 八宿县| 阳西县| 娄烦县| 筠连县| 时尚| 托克逊县| 稷山县| 土默特右旗| 吉林市| 绥棱县| 扬中市| 全州县| 黄龙县| 永平县| 孟津县| 玉环县| 成武县| 巨野县| 隆子县| 泾阳县| 牙克石市| 麻江县| 大荔县|