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