日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言中數據是如何存儲在內存中的_C 語言

作者:耀?星 ? 更新時間: 2022-06-20 編程語言

前言

在計算機內存中,數據的存儲方式都是以0和1的形式存儲,也就是二進制的形式,數據是如何向內存寫入的呢?整形數據以補碼的形式存儲,浮點型的存儲規則較多,類似于科學計數法。

?數據類型介紹

為什么需要有這些數據類型?

數據類型解決了數據存儲的問題。

?整形數據在內存中存儲

整數中有三種二進制表示形式,分別是原碼、反碼、補碼,正整數的原碼 = 反碼 = 補碼,通常取最高位作為符號位。

原碼:直接將正負整數按照二進制形式轉換即可。

15原碼: ?(0) 1111?
-15原碼: (1) 1111
23原碼: ?(0) 10111
-28原碼: (1) 11100
注意:()表示符號位,1表示負,0表示正。

補碼:負整數的補碼將原碼的符號位不變,其它位依次取反。

15反碼: ?(0) 1111?
-15反碼: (1) 0000
23反碼: ?(0) 10111
-28反碼: (1) 00011

反碼:負整數的反碼在補碼的基礎上+1

15補碼: ?(0) 1111?
-15補碼: (1) 0001
23補碼: ?(0) 11000
-28補碼: (1) 00100

對于整形數據來說:數據存放的實際是存放補碼。

當我們定義變量時,系統會根據變量的數據類型,給變量開辟空間。這也是為什么要引入數據類型這個概念。

1.舉例:5是如何存儲到內存中

5是一個整形常量,在C語言中寫一個整形常量,不超過int類型所能表示的范圍,以32位表示整形常量。

5的原碼碼 = 補碼 = 反碼

5原碼:00000000 00000000 00000000 00000101

5存入short類型的變量:取后16位

00000000 00000000 00000000 00000101

5存入int類型的變量:取32位

00000000 00000000 00000000 00000101

2.舉例:-10是如何存儲到內存中的?

-10原碼:10000000 00000000 00000000 00001010

-10反碼:11111111?11111111 11111111 11110101

-10補碼:11111111?11111111 11111111 11110110

-10存入short類型:取后16位

11111111?11111111 11111111 11110110

-10存入int類型變量:取32位

11111111?11111111 11111111 11110110

?如何取出數據?

取出數據首先要知道數據的地址,得到地址后,如何確定取出范圍,由變量的數據類型來決定。

int main()
{
	/*
	a的原碼、反碼、補碼:00000000 10011000 10010110 1000000
	*/
	int a = 10000000;
	/*
	b是short*類型,解引用訪問時,只有訪問兩個字節的權限
	*b拿出的數據是補碼: 10010110 10000000->原碼:11101001 10000000
	*/
	short* b = &a;
	printf("%d", *b);//-27008
	return 0;
}

為什么要使用補碼的形式存儲?

在計算機中CPU有中,只有加法器。以補碼形式存儲,符號位參與運算,既可以計算減法也可以計算加法。

大端存儲模式:指數據的低位保存在內存的高地址中,而數據的高位,保存在內存的低地址中。

小端存儲模式:指數據的低位保存在內存的低地址中,而數據的高位,保存在內存的高地址中。

?大小端主要由處理器決定,與編譯器,操作系統這些沒有直接的關系。

?浮點型數據在內存存儲

根據國際標準IEEE(電氣和電子工程協會)754,任意一個二進制浮點數V可以表示成下面的形式:

  • (-1)S*M*2^E
  • (-1)S表示符號位,當S = 0,V為正數;S = -1,V為負數
  • M表示有效數值,大于等于1,小于2
  • 2^E表示指數位?

類似于科學計數法:1090 = 1.090*10^3?

IEEE754規定單精度浮點型和雙精度浮點型存儲模型

IEEE 754對有效數字M和指數E,還有一些特別的規定。

1<=M<2,M可以寫成1.xxxxxx的形式,xxxxxx表示小數部分。

IEEE754規定,在計算機內部保存M時,默認這個數的第一位總是1,因此可以舍去,只保存后面的xxxxxx部分。在讀取時,再把第一位添上。節省一位有效數字.

對于指數E,情況比較多。

首先E為無符號整數,如果E為八位,取值范圍時0~255,E為11位,取值范圍為0~2047,但是再科學計數法中E可以出現負數,所以IEEE 754則規定,存入內存E的真實數必須加上一個中間數,對于八位的E,中間數為127,對于11位的E,中間數位1023。例如2^13的E是13,所以在保存E時,必須保存成13+127 = 140,即10001100。

指數E從內存中取出還可以分為3種情況

1.E不全為0或不全為1

這時浮點數就采用下面的規則表示,即指數E的計算值減去127(或1023),得到真實值,再將有效數字M前加上第一位的1。

比如:

0.5的二進制位0.1,由于規定整數部分1<=M<2,即第一位必須位1,則將小數點右移一位,則為1.0*2^(-1),E的實際存儲位-1+127,E的實際存儲為01111110,M = 1.0,小數部分為0,M的存儲為23位00000000000000000000000。

則0.5的二進制表示形式位:

0 01111110 00000000 00000000 0000000

2.E全為0

這時,浮點數的指數E等于1-127(或者1-1023),即為真實值

有效數字M不再加上第一位的1,而是還原位0.xxxxxx的小數,這樣可以表示0,以及接近于0的很小數字。

3.E全為1

如果有效數字M全位0,表示無窮大。

舉例:

10.0轉化為二進制形式為1010.0,相當于:1.010*2^3,按照標準格式 可得S = 0,M = 1.010,E = 3。

舉例1:7.25是如何存儲到內存中的呢?

首先將7.25轉化為二進制111.01

寫成標準形式:1.1101*2^2

S = 0,M = 1101,E = 2+127

0 10000001 11010000 00000000 0000000

驗證:?

有誤的地方還請批評指正。?

原文鏈接:https://blog.csdn.net/qq_52763385/article/details/124111982

欄目分類
最近更新