系列文章目錄
文章目錄
- 系列文章目錄
- 前言
前言
目的:學習整數在內存的儲存,什么是大小端,浮點數的儲存。
1. 整數在內存中的存儲
在講解操作符的時候,我們就講過了下?的內容:
整數的2進制表??法有三種,即 原碼、反碼和補碼。
正整數的原、反、補碼都相同。負整數的三種表??法各不相同。原碼:直接將數值按照正負數的形式翻譯成?進制得到的就是原碼。反碼:將原碼的符號位不變,其他位依次按位取反就可以得到反碼。補碼:反碼+1就得到補碼,補碼也可以取反+1得到源碼。

在計算機系統中,數值?律?補碼來表?和存儲。原因在于,使?補碼,可以將符號位和數值域統?處理;同時,加法和減法也可以統?處理(CPU只有加法器)此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬件電路。
2. ??端字節序和字節序判斷
#include <stdio.h>
int main()
{int a = 0x11223344;return 0;
}
調試一下,我們可以看到在a中的 0x11223344 這個數字是按照字節為單位,倒著存儲的。
2.1 什么是??端?
1.?端(存儲)模式:是指數據的低位字節內容保存在內存的?地址處,?數據的?位字節內容,保存 在內存的低地址處。2.?端(存儲)模式:是指數據的低位字節內容保存在內存的低地址處,?數據的?位字節內容,保存 在內存的?地址處。上述概念需要記住,?便分辨??端。
?圖片展示一下:
?2.2 為什么有??端?
//代碼1
#include <stdio.h>
int check_sys()
{int i = 1;return (*(char *)&i);//下面分析:
}
int main()
{int ret = check_sys();if(ret == 1){printf("?端\n");}else{printf("?端\n");}return 0;
}
分析:
下面我們 來做一些有關數據的儲存的練習:
案例1:
#include <stdio.h>
int main()
{char a= -1;signed char b=-1;unsigned char c=-1;printf("a=%d,b=%d,c=%d",a,b,c);return 0;
}
輸出結果:
我們來一個一個分析:
?b變量也是和a是一樣的
?案例2:
#include <stdio.h>
int main()
{char a = -128;printf("%u\n",a);return 0;
}
char的范圍-128~127,那這個案例輸出結果為:
這是為什么呢?
分析如圖:
在這里我們記住兩圖,記住就行:
signed char:
?unsigned char:
案例3:
#include <stdio.h>
int main()
{char a[1000];int i;for(i=0; i<1000; i++){a[i] = -1-i;}printf("%d",strlen(a));return 0;
}
在這里上面那幅圖就很重要了,輸出結果是:
字符串長度找到\0.也就是0
循環到255時在++,變成了0,所以是255.
案例4:
#include <stdio.h>
unsigned char i = 0;
int main()
{for(i = 0;i<=255;i++){printf("hello world\n");}return 0;
}
這個一看就是死循環,unsigned char的值范圍0~255,所以會一直打印hello world。
案例5:
#include <stdio.h>
int main()
{unsigned int i;for(i = 9; i >= 0; i--){printf("%u\n",i);}return 0;
}
輸出結果:
也是死循環為什么?因為i = -1時,位無符號-1的無符號是一個很大的正數,所以死循環。
3. 浮點數在內存中的存儲
V ? = ?(?1) ^ S * M ? 2^E? (?1) S 表?符號位,當S=0,V為正數;當S=1,V為負數? M 表?有效數字,M是?于等于1,?于2的? 2^? E 表?指數位
?舉例來說:


3.1浮點數存數的過程
IEEE 754 對有效數字M和指數E,還有?些特別規定:
#include<stdio.h>
int main()
{float a = 5.5f; return 0;
}
那么浮點數是如何儲存進儲存的呢?
不妨看看詳細分析:
3.2浮點數取的過程?
#include <stdio.h>
int main()
{int n = 9;float *pFloat = (float *)&n;printf("n的值為:%d\n",n);printf("*pFloat的值為:%f\n",*pFloat);*pFloat = 9.0;printf("n的值為:%d\n",n);printf("*pFloat的值為:%f\n",*pFloat);return 0;
}
輸出結果:
這是為什么呢?來一個一個分析:
?所以不要把浮點數和正數打印錯了。
好了,今天就到這里了,都看到這里了,點一個贊吧,謝謝觀看。