目錄
數(shù)據(jù)從大的方向分為兩類:
內(nèi)置類型我們前面已經(jīng)學(xué)習(xí)過,如下:
char? ? ? ? ? ? //字符數(shù)據(jù)類型
short? ? ? ? ? ?//短整型
int? ? ? ? ? ? ? ?//整形
long? ? ? ? ? ? //長整型
long long? ? ?//更長的整形
float? ? ? ? ? ? ?//單精度浮點(diǎn)數(shù)
double? ? ? ? ?//雙精度浮點(diǎn)數(shù)
char
????????unsigned char
????????signed char
short
????????unsigned short [int]
????????signed short [int]
int
????????unsigned int
????????signed int
long
????????unsigned long [int]
????????signed long [int]這里為什么把字符也歸進(jìn)了整型家族呢?
因?yàn)樽址诖鎯?chǔ)的時(shí)候存儲(chǔ)的是這個(gè)字符的ASCII碼值,char到底是signed char還是unsigned char這取決于編譯器,short,int, long都是有符號(hào)的
float
double
?數(shù)組類型
?結(jié)構(gòu)體類型 struct
?枚舉類型 enum
?聯(lián)合類型 union
int* ptr;
char* ps;
float* pc;
void* pd;
void 表示空類型(無類型)
通常應(yīng)用于函數(shù)的返回類型、函數(shù)的參數(shù)、指針類型
整型在內(nèi)存中究竟是如何存儲(chǔ)的呢?? 請看如下代碼:
int main(){ int a = 5; int b = -1;}
我們可以在內(nèi)存中先看一下:
為什么會(huì)是這樣的結(jié)果
分析:
數(shù)據(jù)在內(nèi)存中存儲(chǔ)時(shí)是存的二進(jìn)制?,VS編譯器為了方便展示,展示的是16進(jìn)制
a和b都是整型,占4個(gè)字節(jié),這里顯示的16進(jìn)制中,每2位是一個(gè)字節(jié)
可以再來看看下面的這段代碼:
int main(){ int a = 0x11223344; //16進(jìn)制}
內(nèi)存:
可以看到a里面應(yīng)該是16進(jìn)制的11223344,結(jié)果內(nèi)存中顯示的卻是44332211,應(yīng)該是倒著存的?
那到底是怎么存的,我們需要搞懂原碼,反碼和補(bǔ)碼
三種表示方法均有符號(hào)位和數(shù)值位兩部分,符號(hào)位都是用0表示“正”,用1表示“負(fù)”,而數(shù)值位
三種表示方法各不相同。
原碼:
直接將一個(gè)數(shù)按照正負(fù)數(shù)的形式寫成二進(jìn)制
反碼:
原碼的符號(hào)位不變,其他位按位取反就可以得到了
補(bǔ)碼:
反碼+1就得到補(bǔ)碼
注意:正數(shù)的原碼,反碼,補(bǔ)碼相同
然后我們可以將-1的二進(jìn)制寫出來和內(nèi)存里面的對比一下
-1
原碼:10000000000000000000000000000001
反碼:11111111111111111111111111111110
補(bǔ)碼:11111111111111111111111111111111
將補(bǔ)碼寫成16進(jìn)制就是
FFFFFFFF
也就是內(nèi)存中看到的這樣
所以就知道了整數(shù)數(shù)據(jù)在內(nèi)存中存的是補(bǔ)碼?
在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來表示和存儲(chǔ)。原因在于,使用補(bǔ)碼,可以將符號(hào)位和數(shù)值域統(tǒng)一處理; 同時(shí),加法和減法也可以統(tǒng)一處理(CPU只有加法器)此外,補(bǔ)碼與原碼相互轉(zhuǎn)換,其運(yùn)算過程是相同的,不需要額外的硬件電路。
寫出5的補(bǔ)碼
0000 0000 0000 0000 0000 0000 0000 0101
16進(jìn)制形式
0 0 0 0 0 0 0 5
內(nèi)存中看到的:
?會(huì)發(fā)現(xiàn)將內(nèi)存中的數(shù)字倒著讀就是5的補(bǔ)碼的16進(jìn)制形式
那為什么在內(nèi)存中是倒著存的呢?? 這和大小端字節(jié)序有關(guān)
如果我們要在內(nèi)存中存0x11223344
那就有多種存儲(chǔ)方式了
- 11223344? ? (正序)
- 44332211? ? (倒序)
- 其他
到了最后基本能用到的也就是兩種存儲(chǔ)模式
- 大端字節(jié)序存儲(chǔ)
- 小端字節(jié)序存儲(chǔ)
通過下面的圖來理解大端和小端
?存儲(chǔ)的時(shí)候以字節(jié)為單位來存儲(chǔ)
大端存儲(chǔ)模式:數(shù)據(jù)的低位存儲(chǔ)在內(nèi)存的高地址處,高位存儲(chǔ)在低地址處
小端存儲(chǔ)模式:數(shù)據(jù)的低位存儲(chǔ)在內(nèi)存的低地址處,高位存儲(chǔ)在高地址處
為什么會(huì)有大小端模式之分呢?這是因?yàn)樵谟?jì)算機(jī)系統(tǒng)中,我們是以字節(jié)為單位的,每個(gè)地址單元都對應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對于位數(shù)大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個(gè)字節(jié),那么必然存在著一個(gè)如果將多個(gè)字節(jié)安排的問題。因此就導(dǎo)致了大端存儲(chǔ)模式和小端存儲(chǔ)模式。
例如一個(gè)16bit 的short 型x ,在內(nèi)存中的地址為0x0010 , x 的值為0x1122 ,那么0x11 為高字節(jié), 0x22為低字節(jié)。對于大端模式,就將0x11 放在低地址中,即0x0010 中, 0x22 放在高地址中,即0x0011 中。小端模式,剛好相反。我們常用的X86 結(jié)構(gòu)是小端模式,而KEIL C51 則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來選擇是大端模式還是小端模式。
請簡述大端字節(jié)序和小端字節(jié)序的概念,設(shè)計(jì)一個(gè)小程序來判斷當(dāng)前機(jī)器的字節(jié)序
第一個(gè)小問題上面已經(jīng)說了,這里就不再啰嗦,主要來看看如何設(shè)計(jì)程序來判斷當(dāng)前機(jī)器的字節(jié)序
小端字節(jié)序是低位低地址,高位存儲(chǔ)在高地址處,根據(jù)這一特征我們就可以寫出來
比如1在內(nèi)存中的存儲(chǔ)如果是小端的話,就是01 00 00 00,我們可以只訪問它的第一個(gè)字節(jié)的空間拿到的如果是1,那就說明是小端存儲(chǔ)模式,是0的話那就是大端存儲(chǔ)模式。之前我們學(xué)指針的時(shí)候知道指針的類型決定了它可以訪問多大的空間,我們要訪問一個(gè)字節(jié),就可以用char*
如下代碼
#include int main(){ int a = 1; char* p = (char*)&a; if (*p == 1) { printf("小端字節(jié)序/n"); } else { printf("大端字節(jié)序/n"); } return 0;}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/121846.html
目錄 一、枚舉 (一)枚舉類型的定義 (二)使用枚舉的原因? (三)枚舉的優(yōu)點(diǎn)? (四)枚舉的大小 (五)枚舉的使用 二、聯(lián)合(共用體) (一)聯(lián)合類型的定義 (二)聯(lián)合的特點(diǎn) (三)面試題 (四)聯(lián)合大小的計(jì)算 一、枚舉 枚舉顧名思義就是:列舉?。? ?即把可能的取值一一列舉出來。 比如我們現(xiàn)實(shí)生活中: 一周當(dāng)中從周一至周日的7天,可以一一列舉;性別有:男、女、保密,可以一一列舉;月份有...
小編寫這篇文章的主要目的,主要是介紹關(guān)于Python的一些知識(shí),其中的內(nèi)容主要還是涉及到其基本的數(shù)據(jù)類型,那么,到底有多少種的數(shù)據(jù)類型呢?下面就給大家詳細(xì)解答下。 Python中主要有8種數(shù)據(jù)類型:number(數(shù)字)、string(字符串)、list(列表)、tuple(元組)、dict(字典)、set(集合)、Boolean(布爾值)、None(空值)。 其中Python有六個(gè)標(biāo)準(zhǔn)的數(shù)...
摘要:字符串常量適用于那些對它不做修改的字符串函數(shù)。同時(shí),語言提供了一系列庫函數(shù)來對操作字符串,這些庫函數(shù)都包含在頭文件中。目標(biāo)空間必須足夠大,以確保能存放源字符串。拷貝個(gè)字符從源字符串到目標(biāo)空間。 前言: ????????字符串是一種非常重要的數(shù)據(jù)類型,但是C語言不存在顯式的字符串類型,C...
小編寫這篇文章的主要目的,主要是來給大家解答下關(guān)于python數(shù)學(xué)建模的一些相關(guān)的介紹,涉及到內(nèi)容涵蓋Numpy的一些相關(guān)的應(yīng)用具體的一些介紹。另外,還會(huì)涉及到相關(guān)的Pandas學(xué)習(xí)知識(shí),具體內(nèi)容下面給大家詳細(xì)解答下。 1 Numpy介紹與應(yīng)用 1-1Numpy是什么 NumPy是一個(gè)運(yùn)行速度非常快的數(shù)學(xué)庫,一個(gè)開源的的python科學(xué)計(jì)算庫,主要用于數(shù)組、矩陣計(jì)算,包含: 一個(gè)強(qiáng)大的...
摘要:導(dǎo)航前言功能函數(shù)結(jié)構(gòu)設(shè)定菜單交互主函數(shù)通訊錄初始化新增聯(lián)系人查找聯(lián)系人刪除聯(lián)系人修改聯(lián)系人查看所有聯(lián)系人清空所有聯(lián)系人以名字排序所有聯(lián)系人結(jié)尾語前言本文將實(shí)現(xiàn)一個(gè)簡易的電話簿管理。信息包括名字,性別,電話號(hào)碼,年齡,住址。 ...
閱讀 1294·2021-10-08 10:05
閱讀 4105·2021-09-22 15:54
閱讀 3105·2021-08-27 16:18
閱讀 3106·2019-08-30 15:55
閱讀 1435·2019-08-29 12:54
閱讀 2747·2019-08-26 11:42
閱讀 542·2019-08-26 11:39
閱讀 2128·2019-08-26 10:11