詳解C語言中數據的存儲
一、類型歸類
對於基本的c語言數據類型的基本歸類
1、整形傢族
char (內存存儲的為ascall碼值,存儲為整數) unsigned char// unsigned為無符號關鍵字 signe char// short unsigned short (int)// (int )表示int可以省略不寫 signed short (int) int unsigned int signed int long unsigned long (int) signed long (int)
2、浮點型傢族
float
double
3、指針類型
int* ptr; char* pa; float* pf; void* pv;
4、空類型
void 表示空類型(無類型)
通常應用於函數的返回類型,返回參數,指針類型
二、類型的意義
1.占據的內存大小
2.作為數據時所操作的大小(即為數據看待類型的視角)
三、數據在類型中存儲(以整形和浮點型為例子)
1. 關於 存儲的基本概念
計算機的(整形)有符號數,有三種表示方法,原碼,反碼,補碼
三種表示方法 均存在 符號位 和 數值位 兩部分,符號位的‘0’表正,‘1’表示負,數值位表示方法有差異(對於無符號數:原,反,補表示相同)
原碼:直接將數字按照正負,用二進制方法翻譯表示;
反碼:將原碼的符號位不變,其他位按位取反;
補碼:反碼+1;
對於正數而言,原,反,補相同:
int a=20; // 00000000 00000000 00000000 00010100 原碼 // 00000000 00000000 00000000 00010100 反碼 // 00000000 00000000 00000000 00010100 補碼
對於負數而言
int a=-1; // 10000000 00000000 00000000 00001010 原碼 // 11111111 11111111 11111111 11110101 反碼 // 11111111 11111111 11111111 11110110 補碼
對於整形數據而言再內存存儲的是補碼
2.存儲模式
1.大端模式(大端字節序模式):較高的有效字節存儲在較低的存儲器地址,較低的有效字節存儲在較高的存儲器地址。
2.小端模式(小端字節序模式):較低的有效字節存儲在較低的存儲器地址,較高的有效字節存儲在較高的存儲器地址。
地址的視圖
低——————————–>——–高
關於設計判斷當前機器的字節序
int check_sys(void) { int a=1; char* p=(char*)&a;//訪問第一個字節序看是 01.....0 還是 0...01 return *p; } int main() { int ret=check_sys(); if(ret==1) printf("小端"); else printf("大端"); }
在這裡強制轉化成(char*)利用他隻訪問一個字節的視角進行觀測
指針類型的意義
1.指針類型決定瞭指針類型解引用操作符能訪問幾個字節
2.指針+類型決定瞭指針+1跳過幾個字節
四.應用
應用前應掌握的基本概念 整形提升
1.
char a=-1; // -1作為整形數在內存中以補碼形式存儲 // 10000000 00000000 00000000 0000001-原碼 // 11111111 11111111 11111111 1111110 - 反碼 // 11111111 11111111 11111111 1111111 -補碼 // 當被賦予a時 a為char型隻能存儲8個字節 就要發生 截斷 // 即 a 存儲為 1111111 signed char b=-1; // sigend為默認關鍵字 聲明和聲明都默認為有符號 // 同理 b 1111111 unsigned char c=-1; // c 1111111將高位當做數值位對待 printf("%d %d %d ",a,b,c); // -1 -1 255 // 當要打印為%d 應當發生整形提升 // 負數為有符號型 整形提升高位補1; // 無符號型提升高位補0,將原高位看作數值位 // 將 計算過程的 補碼 轉換為原碼後即為所求結果
2.
char a=-128; printf("%u\n",a);
char a=-128; //10000000 00000000 00000000 10000000 //11111111 11111111 11111111 01111111 //11111111 11111111 11111111 10000000 // 截斷10000000 // char a 有符號 按符號位提升 //整形提升 11111111 11111111 11111111 10000000 作為 無符號數 原反補相同 //11111111 11111111 11111111 10000000-轉換為對應的十進制數
對於char范圍的討論
有符號的(以下均為補碼)
有符號char范圍 -128 –127
例題
char a[1000]; int i; for(i=0;i<1000;i++) { a[i]=-1-i; } printf("%d",strlen(a));
對於 a[i]的計算結果 從 -1……-128..127….1 0
所以所得結果為 128+127=255
無符號(同補碼)
最高位視為數值位則 范圍為 0 —255
例題
unsigned char i=0; for(i=0;i<255;i++) { printf(" hello\n"); }
思路同上
程序陷入死循環
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!