C++淺析數(shù)據(jù)在內(nèi)存中如何存儲_第1頁
C++淺析數(shù)據(jù)在內(nèi)存中如何存儲_第2頁
C++淺析數(shù)據(jù)在內(nèi)存中如何存儲_第3頁
C++淺析數(shù)據(jù)在內(nèi)存中如何存儲_第4頁
C++淺析數(shù)據(jù)在內(nèi)存中如何存儲_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第C++淺析數(shù)據(jù)在內(nèi)存中如何存儲目錄一、數(shù)據(jù)類型二、原碼反碼補碼三、大小端整型提升

一、數(shù)據(jù)類型

數(shù)據(jù)類型有7種:

char字符型

short短整型

int整型

long長整型

longlong更長整型

float單精度浮點數(shù)

double雙精度浮點數(shù)

二、原碼反碼補碼

計算機中的整數(shù)有三種2進制表示方法,即原碼、反碼和補碼。

三種表示方法均有符號位和數(shù)值位兩部分,符號位都是用0表示正,用1表示負,而數(shù)值位正數(shù)的原、反、補碼都相同。

負整數(shù)的三種表示方法各不相同.

原碼:是直接將數(shù)值按照正負數(shù)的形式翻譯成二進制得到原碼。

反碼:原碼的符號位不變,其他位依次按位取反得到反碼。

補碼:反碼加1,得到補碼。

計算例子:如圖

計算a+b:

a是正數(shù),原碼等于補碼:00000000000000000000000000000111

b是負數(shù),原碼:10000000000000000000000000001010

反碼:111111111111111111111111111110101

補碼:11111111111111111111111111110110

a+b的補碼分別相加得到:11111111111111111111111111111101

而打印的是%d即有符號整型,要把它轉(zhuǎn)化為原碼,減一取反的到原碼:

10000000000000000000000000000011再化為10進制就是-3

看下運行結(jié)果:

三、大小端

數(shù)據(jù)在內(nèi)存中有兩種存儲方式一個是大端模式一個是小端模式。

在計算機系統(tǒng)中,以字節(jié)為單位的,每個地址單元對應(yīng)著一個字節(jié),一個字節(jié)為8bit。但在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對于位數(shù)大于8位的處理器,例如16位或者32位的處理器,由于奇存器寬度大于一個字節(jié),那么心然存在著一個如何將多個字節(jié)安排的問題。這導致了大端存儲模式和小端存儲模式。

我們?nèi)绾闻袛喈斍皺C器的字節(jié)順序:

#includestdio.h

intis_sys()

inta=1;

return(*(char*)

intmain()

intret=is_sys();

if(ret==1)

printf("小端\n");

else

printf("大端\n");

return0;

取一個整型數(shù)1,補碼:000000000000000000000000000001,要判斷它哪種存儲模式,只需要拿出第一個字節(jié),因為低位放在高地址處時是大端,低位放在低地址處時小端,取地址先轉(zhuǎn)化為字符型指針保證拿出一個字節(jié),再解引用取出內(nèi)容,如果是1就是小端,反之是大端。

整型提升

C的整型算術(shù)運算總是至少以缺省整型類型的精度來進行的。為了獲得這個精度,表達式中的字符和短整型操作數(shù)在使用之前被轉(zhuǎn)換為普通整型,這種轉(zhuǎn)換稱為整型。

我們用字符類型存儲數(shù)據(jù)會發(fā)生截斷,因為一個數(shù)是四個字節(jié),字符型只能存儲一個字節(jié),截斷之后看當前符號位:

對于有符號類型,如果是1就把1之前的位補全1進行整型提升,如果是0就把0之前的位補全0進行整型提升。

對于無符號類型,直接補全0.

(1)我們看如下例子就能很好理解:

#includestdio.h

intmain()

chara=-2;

unsignedcharb=-10;

printf("%d%d",a,b);

a=-2,原碼:1000000000000000000000000000010

反碼:11111111111111111111111111111101

補碼:11111111111111111111111111111110

但是a是字符型只能存一個字節(jié),會發(fā)生截斷只取低位的一個字節(jié)即:11111110

而我們打印的是有符號整型%d,會發(fā)生整型提升,因為它是負的,所以在前面補1

11111111111111111111111111111110,而打印的是原碼,所以再轉(zhuǎn)換為原碼。減一取反:10000000000000000000000000000010結(jié)果是-2

b=-10,原碼:10000000000000000000000000001010

反碼:11111111111111111111111111110101

補碼:11111111111111111111111111110110

同上截斷之后:11110110因為他是無符號整型在前面補0:

00000000000000000000000011110110.直接是原碼打印結(jié)果是246.

再驗證下結(jié)果:

(2)另外%u是打印無符號整型。也是被截斷之后看原來的數(shù)是否有符號,如果有符號不補1或補0,無符號直接補0.然后補完之后直接當做原碼打印

例如char=-128

原碼:10000000000000000000000010000000

反碼:11111111111111111111111101111111

補碼:11111111111111111111111110000000

因為是字符型拿低位的一個字節(jié)1000000,又因為他是負數(shù)補1:

11111111111111111111111110000000,直接當原碼打印因數(shù)太大直接看結(jié)果:

(3)再來分析一個:

#includestdio.h

intmain()

inti=-20;

unsignedcharj=10;

unsignedcharb=i+j;

printf("%u",b);

i的原碼:10000000000000000000000000010100;

反碼:1111111111111111111111111101011

補碼:11111111111111111111111111101100

而j是無整形且字符型值因為它是正數(shù),原碼等于補碼:

00000000000000000000000000001010

兩者

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論