詳解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的更多內容!

推薦閱讀: