日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

int、unsigned int、float、double 和 char 在内存中存储方式

發(fā)布時(shí)間:2024/10/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 int、unsigned int、float、double 和 char 在内存中存储方式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2017-12-28 創(chuàng)建人:Ruo_Xiao 實(shí)驗(yàn)環(huán)境:vs2010、Intel 郵箱:xclsoftware@163.com 2018-01-16 修改人:Ruo_Xiao添加對(duì)移位存儲(chǔ)的說(shuō)明。 2020-11-17 修改人:Ruo_Xiao優(yōu)化代碼格式。

零、基礎(chǔ)知識(shí)

  • 原碼、反碼和補(bǔ)碼是計(jì)算機(jī)存儲(chǔ)數(shù)字的編碼方式(表示方法)。
    拓展:ASCII 碼、utf-8 和 utf-16 是計(jì)算機(jī)存儲(chǔ)字符的編碼方式。

  • 原碼:符號(hào)位+數(shù)值的絕對(duì)值。
    (1)以 8 位為例,1 的原碼為 0000 0001,-1 的原碼為 1000 0001。
    (2)取值范圍:11111111 ~ 01111111,即:-127 ~ 127。

  • 反碼:正數(shù)的反碼是原碼,負(fù)數(shù)的反碼是在原碼的基礎(chǔ)上符號(hào)位不變,其他位取反的結(jié)果。
    以8位為例:1的反碼為 0000 0001,-1的反碼為 1111 1110。

  • 補(bǔ)碼:正數(shù)的補(bǔ)碼是原碼,負(fù)數(shù)的補(bǔ)碼是在原碼的基礎(chǔ)上符號(hào)位不變,其他位取反再加一,即:反碼+1。
    以8位為例:1 的補(bǔ)碼為 0000 0001,-1 的補(bǔ)碼為 1111 1111。

  • 補(bǔ)碼存在的意義
    (1)1 - 1 = 1 + (-1) = (0000 0001)(原) + (1000 0001)(原) = (1000 0010)(原) = -2。錯(cuò)誤
    (2)3 + 5 = (0000 0011)(原) + (0000 0101)(原) = (0000 1000)(原) = 8。正確
    (3)反碼相減:3 - 4 = (0000 0011)(原) + (1000 0100)(原) = (0000 0011)(反) + (1111 1011)(反) = (1111 1110)(反) = (1000 0001)(原) = -1。正確
    (4)反碼相減:5 - 3 = (0000 0101)(原) + (1000 0011)(原) = (0000 0101)(反) + (1111 1100)(反) + 1(循環(huán)進(jìn)位)= (0000 0010)(反) = (0000 0010)(原) = 2。正確
    (5)1 - 1 = 1 + (-1) = (0000 0001)(反) + (1111 1110)(反) = (1111 1111)(反) = (1000 0000) = -0。
    (6)1 - 1 = (0000 0001)(原) + (1000 0001)(原) = (0000 0001)(補(bǔ)) + (1111 1111)(補(bǔ))= (0000 0000) (補(bǔ)) = (0000 0000) (原) = 0。
    (7)-1-127 = (1000 0001)(原) + (1111 1111)(原) = (1111 1111)(補(bǔ)) + (1000 0001)(補(bǔ)) = (1000 0000)(補(bǔ)) = -128。

    A、由(1)和(2)可知,原碼相加是正確的,但是相減是錯(cuò)誤的。
    B、由(3)和(4)可知,反碼相加減都是正確的。
    C、但是由(5)可知,1-1 的反碼結(jié)果為 -0,這個(gè)結(jié)果在數(shù)學(xué)上是沒(méi)有意義的,為了解決這個(gè)問(wèn)題,引入了補(bǔ)碼。因?yàn)檠a(bǔ)碼是在反碼的基礎(chǔ)上加 1,故補(bǔ)碼的加減是沒(méi)有問(wèn)題的,關(guān)鍵是 1-1 了。由(6)可知,補(bǔ)碼完美的解決了 1-1 等于 -0 的尷尬局面,直接得到 0 。
    D、由(7)可知,計(jì)算機(jī)底層算法規(guī)定了補(bǔ)碼 1000 0000 = -128。這也就導(dǎo)致了補(bǔ)碼的取值范圍由-127127變?yōu)?128127。

  • 總結(jié):
    (1)由于原碼相減結(jié)果不對(duì),故使用了反碼。但是反碼1-1得到的結(jié)果是-0,這個(gè)在數(shù)學(xué)上是無(wú)意義的,為了導(dǎo)出 1-1=0 的正確結(jié)果,故使用了補(bǔ)碼,同時(shí)規(guī)定補(bǔ)碼1000 0000 = -128,從而可以將-0表示為 -128,拓展了一個(gè)表示位,故8位二進(jìn)制取值范圍為 -128~127 。
    (2)這里再次強(qiáng)調(diào),在計(jì)算機(jī)中,數(shù)據(jù)都是以正數(shù)的補(bǔ)碼的形式存在的。正數(shù)的補(bǔ)碼是其本身,負(fù)數(shù)則是以其本身的正數(shù)的補(bǔ)碼的形式存在的。
    栗子:-123 在計(jì)算機(jī)中的存儲(chǔ)的值是 1111 1011 -> 1000 0100 -> 1000 0101。

  • 一、int

  • 占用 4 個(gè)字節(jié),即:32b,有符號(hào)位:從左數(shù)第一位。
  • 取值范圍:-2^31 ~ 2^31-1。
    原因:0 代表 +0,-0 代表 -2^31,故負(fù)數(shù)比整數(shù)多一個(gè)。
  • 數(shù)據(jù)以補(bǔ)碼的形式存放在內(nèi)存中。
  • 對(duì)于 +0 和 -0 在內(nèi)存中的存儲(chǔ)方式。
  • #include "stdafx.h" #include <iostream> using namespace std;int _tmain(int argc, _TCHAR* argv[]) {int i = +0;int k = -0;int *pi = &i;int *pk = &k;char c = '1';char *pc = &c;cout<<"int: "<<sizeof(int)<<" byte"<<endl;cout<<"unsigned int: "<<sizeof(unsigned int)<<" byte"<<endl;cout<<"float: "<<sizeof(float)<<" byte"<<endl;cout<<"double: "<<sizeof(double)<<" byte"<<endl;cout<<"char: "<<sizeof(char)<<" byte"<<endl;cin.get();return 0; }



    二、unsigned int

  • 占用 4 個(gè)字節(jié),即:32b,無(wú)符號(hào)位。
  • 取值范圍:0 ~ 2^32。
  • 數(shù)據(jù)以補(bǔ)碼的形式存放在內(nèi)存中。
  • 三、float

  • 浮點(diǎn)數(shù)在計(jì)算機(jī)中用科學(xué)計(jì)數(shù)法表示,栗:1.0100011*2^7。
  • 符號(hào)位:“+”或者“-”。
  • 指數(shù)部分:2 的冪指數(shù),栗子中的“7”。
  • 尾數(shù)部分:最高位為“1”的底數(shù),栗子中的“10100011”。
  • 栗子:15.987 在計(jì)算機(jī)中存儲(chǔ)方式。
    (1)15.987 的整數(shù)部分原碼:1111。
    (2)15.987 的小數(shù)部分原碼:11111100……此處省略 11 位。
  • 拓展:小數(shù)二進(jìn)制的計(jì)算方法:乘 2 取整,順序排列。
    栗:0.987 的二進(jìn)制的計(jì)算過(guò)程如下:0.9872 = 1.974,則第一位為“1”,0.9742 = 1.948,第二位為“1”,0.948*2 = 1.896,,第三位為“1”,依次類推,直至結(jié)果的小數(shù)為0。當(dāng)然肯定有無(wú)窮盡的,這種情況就是計(jì)算機(jī)存儲(chǔ)浮點(diǎn)數(shù)的精度的問(wèn)題了。所以,只有讓整數(shù)部分和小數(shù)部分的位數(shù)和為 24 位(隱藏位技術(shù))即可。此栗中,小數(shù)精度為 20 位。
    (3)經(jīng)過(guò)上述計(jì)算,15.987的二進(jìn)制為1111.11111100……,用科學(xué)計(jì)數(shù)法表示為1.11111111100……*2^3。
    (4)指數(shù)部分采用移位存儲(chǔ)的方式,即3+(2^7-1) = 130。其二進(jìn)制:10000010。
    (5)尾數(shù)部分省略科學(xué)計(jì)數(shù)法的整數(shù)部分!!(因?yàn)榭隙ㄊ?)(隱藏位)
    (6)15.987在內(nèi)存中的存放的內(nèi)容為:
    符號(hào)位:0(共 1 位)。
    指數(shù)部分:10000010(共 8 位)。
    尾數(shù)部分:111111111000……(共 23 位)。
    (7)寫成完整的二進(jìn)制:0100 0001 0111 1111 1100 0……
    (8)寫成16進(jìn)制:41 7F C……。
    (9)因?yàn)镮ntel的架構(gòu)的字節(jié)序是小端序,則真正的存放內(nèi)容為……C 7F 41。

    四、double

    原理同上!

    五、char

  • 在內(nèi)存中以 ASCII 碼的形式存儲(chǔ)。
  • 栗子:
  • 代碼中字符是“1”,ASCII碼為 49,轉(zhuǎn)換為 16 進(jìn)制為 31。

    六、拓展

  • 移位存儲(chǔ):
    在存儲(chǔ)浮點(diǎn)數(shù)時(shí),若指數(shù)部分若不使用移位存儲(chǔ)技術(shù),則會(huì)導(dǎo)致 0 有兩種表示方式:1000 000 0 和 0000 000 0。所以,為了最大化利用價(jià)值,同時(shí)保留正負(fù)性,在原數(shù)據(jù)的基礎(chǔ)上加 127,其結(jié)果如下:
    0000 000 0~0111 111 1代表著-127~0。
    1000 000 0~1111 111 1代表著1~127。
    這樣正負(fù)指數(shù)均可表示的數(shù)量保持一致。
  • (SAW:Game Over!)

    總結(jié)

    以上是生活随笔為你收集整理的int、unsigned int、float、double 和 char 在内存中存储方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。