資料在記憶體中的儲存

2021-08-14 14:37:18 字數 3958 閱讀 6640

大端,把乙個數字高位位元組序的內容儲存到低位址,低位位元組序內容儲存到高位址處

小端,把乙個數字高位位元組序的內容儲存到高位址,低位位元組序內容儲存到低位址處

判斷乙個機器是大端還是小端?

指標判斷

int checksys()

聯合體(共用體)

union un;

int main()

這裡首先需要知道的是,例子見前文

無符號和普通的變數定義是一樣的,只不過差別在於系統對這塊記憶體空間的識別不同

char a = -1;                  

signed

char b = -1;

unsigned

char c = -1;

printf("a=%d,b=%d,c=%d",a,b,c); //-1 -1 255

//11111111 char(-1)的補碼

//11111111 11111111 11111111 11111111 有符號數整型提公升後的數字

//要看列印(解析)的是多少,再轉回原碼

//10000000 00000000 00000000 00000001 原碼

有符號數高位補符號位,無符號數高位補0。

char a = -128;

//10000000 00000000 00000000 10000000 原

//11111111 11111111 11111111 01111111

//11111111 11111111 11111111 10000000 補

//存的是補碼,低八位 10000000

//整型提公升 11111111 11111111 11111111 10000000

printf("%u",a); //列印無符號數ffffff80

綜合整型提公升,計算原反補的題

char a[1000];

int i;

for(i=0; i<1000; i++)

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

//分析題目,結果就是問陣列到第幾個元素是0(\0)

char 型別可以存有符號數 -127 - 128 ,所以當char 存到-129 時

//10000000 000000000 00000000 10000001 -129 原碼

//11111111 111111111 11111111 01111110

//11111111 111111111 11111111 01111111 char取低八位,127

//a[128] = 11111111 ;

//a[129] = 01111111 ;

//-1 -2 -3 ... -128 127 126 .... 0

所以列印結果是 128+127 = 255

unsigned i;

for(i=9; i>=0; i--)

或者是

unsigned

char i = 0;

for(i=0; i<=255; i++)

整型 limits.h

浮點型 float.h

float f = 5.5;

// 101.1

科學記數法

1.011 * 2^2

標準(-1)^0 * 1.011 *2^2

所以應該存的是

010000001

01100000000000000000000

//0x40b00000

s e m

ieee754規定儲存標準

(-1)^s * m * 2^e

(-1)s表示符號位,當s=0,v為正數;當s=1,v為負數。

m表示有效數字,大於等於1,小於2。

2^e表示指數字,對於8位的e,加上中間數127,11位e+1023

乙個極其好的例子

int n = 9;

float *p = (float *)&n;

000000000

00000000000000000001010 儲存形式

(-1)^0 * 0.0000000000000000001001 * 2^-126 取出(無窮小)特殊情況,e全0,不補1

*p= 9.0;

1001.0 二進位制

1.001*2^3 科學計數

010000010

00100000000000000000000 儲存形式(不存小數點前面的1,後面補0)

(-1)^0 * 1.00100000000000000000000 * 2^130-127 取出,小數點前面補1

棧區(stack)—  由編譯器器自動分配釋放 ,存放為執行函式而分配的區域性變數,函式引數,返回資料、返回位址等

堆區(heap) —  一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。分配方式類似於鍊錶。動態記憶體的生存期由程式設計師決定,如果在堆上分配了空間,就有責任**它,否則執行的程式會出現記憶體洩漏。

全域性區(靜態區)(static)—存放全域性變數靜態資料、常量。程式結束後由系統釋放。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在

文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放

程式**區—存放函式體(類成員函式和全域性函式)的二進位制**

volatile前面說過

volatile 保證記憶體可見性。每次取變數從記憶體中取 .在c編譯環境,const 從語法層面限制了 變數不可定義,從而可以通過指標修改記憶體中變數的值。在cpp編譯環境,const 會被優化,其值被送往暫存器,從而不可改變。linux環境下可以加 -o2 使gcc編譯環境同樣優化const。

const

int b = 0;

int *p = (int *) &b;

*p = 20;

printf("%d",b); //不優化結果是20,優化了結果是0

volatile

const

int b = 0; //保證每次變數從記憶體中拿

int *p = (int *) &b;

*p = 20;

printf("%d",b); //20

即編譯時不優化,執行時不快取,每次需從記憶體中讀出。用於多執行緒或多cpu程式設計

int * const p = &a; //保護指標p

const

int *p = &a; //保護 *p

int a = 0;

int *p = &a;

int* *pp = &p; //二級指標,指向指標p的位址

const

int **pp = &p;

//**pp(a) a不能通過**pp改變

int * const *pp = &p;

*pp 不能改變

int ** const pp = &p;

pp 不能改變

資料在記憶體中的儲存

身為乙個天天處理資料的人,不得不說資料在記憶體中的儲存是必須要知道的問題。首先,資料在記憶體中的儲存涉及到作用域,儲存位置等方面的問題。根據資料的作用域,可將資料劃分為區域性變數和全域性變數 區域性變數的作用域為從定義開始到函式執行結束 全域性變數的作用域從程式開始到程式結束。計算機的記憶體分配可以...

資料在記憶體中的儲存

我們都知道在計算機中資料型別都有 char 1 short 2 int 4 long 4 8 float 4 double 8 等內建型別,以及他們所佔的空間大小。型別的意義 1.使用這個型別開闢記憶體空間的大小 大小決定使用範圍 2.如何看待記憶體空間的視角。型別歸類 整形家族 char unsi...

資料在記憶體中的儲存

1.整形家族 char unsigned char signed char short unsigned short int signed short int int unsigned int signed int long unsigned long int signed long int 2.浮...