C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解上篇
前言
本文開始學(xué)習(xí)C語(yǔ)言進(jìn)階的內(nèi)容了,進(jìn)階內(nèi)容,是在基礎(chǔ)階段的內(nèi)容上進(jìn)行拓展,有的知識(shí)點(diǎn),在基礎(chǔ)階段也已經(jīng)學(xué)過(guò)。在進(jìn)階內(nèi)容中,將從更深層次的角度去理解學(xué)習(xí),本文主要內(nèi)容包括:
- 數(shù)據(jù)類型詳細(xì)介紹
- 整形在內(nèi)存中的存儲(chǔ):原碼、反碼、補(bǔ)碼
- 大小端字節(jié)序介紹及判斷
- 浮點(diǎn)型在內(nèi)存中的存儲(chǔ)解析
1、數(shù)據(jù)類型介紹
在基礎(chǔ)階段已經(jīng)學(xué)習(xí)了基本的類型和存儲(chǔ)空間的大小。
知道了使用某個(gè)類型開辟內(nèi)存空間的大?。ù笮Q定了使用范圍)。
char //字符數(shù)據(jù)類型
short //短整型
int //整形
long //長(zhǎng)整型
long long //更長(zhǎng)的整形
float //單精度浮點(diǎn)數(shù)
double //雙精度浮點(diǎn)數(shù)
類型的基本歸類
整形家族
char
unsigned char//無(wú)符號(hào)
signed char//有符號(hào)
short
unsigned short [int]//無(wú)符號(hào)
signed short [int]//有符號(hào)
int
unsigned int//無(wú)符號(hào)
signed int//有符號(hào)
long
unsigned long [int]//無(wú)符號(hào)
signed long [int]//有符號(hào)
浮點(diǎn)數(shù)家族
float
double
構(gòu)造類型
> 數(shù)組類型
> 結(jié)構(gòu)體類型 struct
> 枚舉類型 enum
> 聯(lián)合類型 union
指針類型
int *pi;
char *pc;
float* pf;
void* pv;
空類型
void 表示空類型(無(wú)類型)
通常應(yīng)用于函數(shù)的返回類型、函數(shù)的參數(shù)、指針類型
2、整形在內(nèi)存中的存儲(chǔ)
一個(gè)變量的創(chuàng)建是要在內(nèi)存中開辟空間的。空間的大小是根據(jù)變量的類型而決定的
//舉例 int a = 20; int b = -10;
int 為整形,占用4個(gè)字節(jié),下面將具體分析變量 a 的數(shù)值20 在內(nèi)存空間中是如何分配的
2.1 原碼、反碼、補(bǔ)碼
計(jì)算機(jī)中的整數(shù)有三種表示方法,即原碼、反碼和補(bǔ)碼:
- 原碼:直接將二進(jìn)制按照正負(fù)數(shù)的形式翻譯成二進(jìn)制就可以
- **反碼:**將原碼的符號(hào)位不變,其他位依次按位取反就可以得到了
- **補(bǔ)碼:**反碼+1就得到補(bǔ)碼
三種表示方法均有符號(hào)位和數(shù)值位兩部分:
- 符號(hào)位都是用0表示“正”,用1表示“負(fù)”
- 正整數(shù)數(shù)的原、反、補(bǔ)碼都相同
- 負(fù)整數(shù)的三種表示方法各不相同
注意,整數(shù)存放在內(nèi)存中的是補(bǔ)碼,操作符的對(duì)象都是補(bǔ)碼,最后打印的是原碼。
舉例說(shuō)明數(shù)值的原碼、反碼、補(bǔ)碼,
// int main() { int a = 10;//正數(shù) 00000000 00000000 00000000 00001010 原碼 00000000 00000000 00000000 00001010 反碼 00000000 00000000 00000000 00001010 補(bǔ)碼 a在內(nèi)存中的存儲(chǔ)形式 00 00 00 0a int b = -10;//負(fù)數(shù) 10000000 00000000 00000000 00001010 原碼 11111111 11111111 11111111 11110101 反碼 11111111 11111111 11111111 11110110 補(bǔ)碼=反碼+1 b在內(nèi)存中存儲(chǔ)的數(shù)值 ff ff ff f6 return 0; }
a的數(shù)值在內(nèi)存中的存儲(chǔ)形式:
b的數(shù)值在內(nèi)存中的存儲(chǔ)形式:
在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來(lái)表示和存儲(chǔ)。原因在于,使用補(bǔ)碼,可以將符號(hào)位和數(shù)值域統(tǒng)一處理;
由于CPU只有加法器,加法和減法也可以統(tǒng)一處理,此外,補(bǔ)碼與原碼相互轉(zhuǎn)換,其運(yùn)算過(guò)程是相同的,不需要額外的硬件電路。
下面將舉例說(shuō)明,數(shù)據(jù)在內(nèi)存中的操作是運(yùn)用補(bǔ)碼而不是原碼的:
int main()使用補(bǔ)碼計(jì)算,打印的是原碼 { 1-1//CPU只有加法器 1+(-1) 第一步: 00000000 00000000 00000000 00000001 1補(bǔ)碼 第二步: 10000000 00000000 00000000 00000001 -1原碼 11111111 11111111 11111111 11111110 -1反碼 11111111 11111111 11111111 11111111 -1補(bǔ)碼 第三步:補(bǔ)碼相加 00000000 00000000 00000000 00000001 1補(bǔ)碼 11111111 11111111 11111111 11111111 -1補(bǔ)碼 結(jié)果是33位,超出范圍 100000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 截?cái)?2位為0 如果使用原碼計(jì)算,結(jié)果是錯(cuò)誤的 00000000000000000000000000000001 1補(bǔ)碼 10000000000000000000000000000001 -1原碼 10000000000000000000000000000010 -2 }
2.2 大小端介紹
2.2.1 什么是大小端
- 大端(存儲(chǔ))模式,是指數(shù)據(jù)的低位保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址中
- 小端(存儲(chǔ))模式,是指數(shù)據(jù)的低位保存在內(nèi)存的低地址中,而數(shù)據(jù)的高位,,保存在內(nèi)存的高地址中
2.2.2 大端和小端意義
- 因?yàn)樵谟?jì)算機(jī)系統(tǒng)中,我們是以字節(jié)為單位的,每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為8bit
- 但是在C語(yǔ)言中除了8 bit的char之外,還有16 bit的short型,32 bit的long型(要看具體的編譯器)
- 另外,對(duì)于位數(shù)大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個(gè)字節(jié),那么必然存在著一個(gè)如何將多個(gè)字節(jié)安排的問(wèn)題。因此就導(dǎo)致了大端存儲(chǔ)模式和小端存儲(chǔ)模式
舉例說(shuō)明大小端,例如:一個(gè) 16bit 的 short 型 x ,在內(nèi)存中的地址為 0x0010 , x 的值為 0x1122 ,那么 0x11 為高字節(jié), 0x22 為低字節(jié)。
- 對(duì)于大端模式,就將 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中
- 對(duì)于小端模式,剛好相反
我們常用的 X86 結(jié)構(gòu)是小端模式,而 KEIL C51 則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來(lái)選擇是大端模式還是小端模式。
int main() { int a = 0x11223344; return 0; }
低字節(jié)0x44擋在低地址中,因此是小端模式:
2.2.3 寫程序判斷字節(jié)序
設(shè)計(jì)一個(gè)小程序來(lái)判斷當(dāng)前機(jī)器的字節(jié)序
int checksys() { int a = 1;//00 00 00 01 char* ch = (char*)&a;//char* 截?cái)嘧止?jié),指針指向低地址數(shù)據(jù) return *ch;//解引用,返回低地址數(shù)據(jù) //return *(char*)&a;//上面兩行代碼也可寫成一行代碼 } int main() { int a = checksys(); if (a==1)//如果低地址保存的數(shù)據(jù)是1,即0x01,就是低字節(jié) { printf("小端\n"); } else { printf("大端\n"); } return 0; }
總結(jié)
數(shù)據(jù)的存儲(chǔ)的學(xué)習(xí)還沒有結(jié)束。
下一篇內(nèi)容繼續(xù)學(xué)習(xí)數(shù)據(jù)的存儲(chǔ)相關(guān)的知識(shí)點(diǎn)。
到此這篇關(guān)于C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解上篇的文章就介紹到這了,更多相關(guān)C語(yǔ)言 數(shù)據(jù)的存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言二進(jìn)制思想以及數(shù)據(jù)的存儲(chǔ)
- C語(yǔ)言中數(shù)據(jù)的存儲(chǔ)詳解
- C語(yǔ)言數(shù)據(jù)的存儲(chǔ)和取出詳細(xì)講解
- C語(yǔ)言詳細(xì)圖解浮點(diǎn)型數(shù)據(jù)的存儲(chǔ)實(shí)現(xiàn)
- C語(yǔ)言數(shù)據(jù)的存儲(chǔ)詳解
- C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解中篇練習(xí)
- 帶你了解C語(yǔ)言的數(shù)據(jù)的存儲(chǔ)
- 詳解C語(yǔ)言中數(shù)據(jù)的存儲(chǔ)
- C語(yǔ)言中數(shù)據(jù)的存儲(chǔ)詳解
相關(guān)文章
C++實(shí)現(xiàn)并優(yōu)化異常系統(tǒng)
異常處理是C++的一項(xiàng)語(yǔ)言機(jī)制,用于在程序中處理異常事件,下面這篇文章主要給大家介紹了關(guān)于C++中異常的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08vc++實(shí)現(xiàn)的tcp socket客戶端和服務(wù)端示例
這篇文章主要介紹了vc++實(shí)現(xiàn)的tcp socket客戶端和服務(wù)端示例,需要的朋友可以參考下2014-03-03C++實(shí)現(xiàn)LeetCode(142.單鏈表中的環(huán)之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(142.單鏈表中的環(huán)之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07windows下安裝QT及visual studio 2017搭建開發(fā)環(huán)境
這篇文章主要介紹了windows下安裝QT及visual studio 2017搭建開發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03