測試環境:
vs2015
windows10
c++中整數資料型別有三種:
int,
long
,short
。在32
位系統中,
int型別和
long
型別在記憶體中都佔
4個位元組,
short
在記憶體中佔兩個位元組。
•無符號整型(
unsigned
):
表示的範圍
0~2^32-1
,即0~4294967295
•有符號整型(
signed
):
可以表示正數和負數,負數在記憶體中都是以補碼的形式儲存,補碼的規則是用
0減去這個數的絕對值,為了計算簡便,通常使用取反加
1的方式求得補碼。
最高位表示符號位,表示的範圍
0x80000000~0x7fffffff
即-2147483648~2147483647。
在資料分析時,如果將記憶體解釋為有符號整數,則檢視用十六進製制數表示時的最高位,最高位小於
8則為正數,大於
8則為負數。如果為負數,則需轉換成真值,從而得到對應的負整數值。
• 大端模式和小端模式:
大端模式:是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;這和我們的閱讀習慣一致。
小端模式:是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低。
如何判斷一段資料是有符號型別還是無符號型別呢?
這就需要檢視指令或者已知的函式如何操作此記憶體位址,根據操作方式或函式相關定義得出該位址的資料型別。
如何判斷是大端模式還是小端模式?
bool
islitte_endian()
int
和long
的區別:
佔記憶體長度不同和取值範圍不同。 32
位系統:
long是4
位元組32
位,int是4
位元組32位。
64位系統:
long是8
位元組64
位,int是4
位元組32位。
c++中用浮點方式儲存實數,用兩種型別儲存浮點數,
float
(單精度)和
double
(雙精度)。在記憶體中,
float佔4
位元組而double佔8
位元組 浮點數的操作不會用到通用暫存器,而會使用浮點協議處理器的浮點暫存器,專門對浮點數進行運算處理。在
vc6.0
中,使用浮點數之前,需要對浮點暫存器進行初始化,然後才能正常執行。
浮點數的操作指令與普通資料型別不同,浮點數操作是通過浮點暫存器來實現的,而普通資料型別使用的是通用暫存器,它們分別使用兩套不同的指令。
字串是由多個字元按照一定排列順序組成的,在
c++中,以『
\0』作為字元結束標誌。
字元的編碼:
ascii
編碼和unicode
編碼,ascii
編碼在記憶體中佔乙個位元組大小,
unicode
編碼在記憶體中佔兩個位元組大小
ascii
編碼和unicode
編碼都可以儲存漢字,它們有什麼不同?
它們對漢字的編碼方式不同,所以儲存同樣的漢字,它們在記憶體中的編碼是不同的。
ascii
使用gb2312-80
,又叫做漢字國標碼,儲存了
6763
個常用漢字編碼,用兩個位元組表示乙個漢字。在
gb2312-80
中用區和位來定位,第乙個位元組儲存每個區,工
94個區;第二個位元組儲存每個區中的位,共
94位。
unicode
使用ucs-2
編碼格式,最多可儲存
65536
個字元。
ucs-2
編碼格式中只儲存了常用字。為了將所有的漢字都容納進來,
unicode
也採用與
ascii
類似的方式——用兩個
unicode
編碼解釋乙個漢字,稱之為
ucs-4
編碼格式。
字串的儲存方式:
結束符,『\0』
, ascii
編碼使用乙個位元組『
\0』,
unicode
編碼使用兩個位元組『
\0』。
用於判斷執行結果的資料型別,它的判斷比較值只有兩種情況,0與非
0,c++中定義
0為假,非
0為真。使用
bool
定義布林型別變數
取乙個變數的位址用『
&』符號,只有變數才存在位址,常亮沒有位址(不包括
const
定義的偽常亮)
指標:
● 指標的定義用「
type*
」,type
為資料型別,任何資料型別都可以定義指標,指標本身也是一種資料型別,用於儲存各種資料型別在記憶體中的位址,指標變數同樣可以取出位址。
指標中儲存的都是位址,為什麼還需要型別作為修飾呢?
因為需要用型別取解釋這個位址中的資料,每種資料型別在記憶體中所佔的記憶體空間不同,指標中只儲存了存放資料的首位址,而沒有指明在**結束,這時就需要根據對應的型別來尋找解釋資料的結束位址。
指標支援哪些運算符號?
指標只支援加法和減法。指標加法用於位址偏移,指標加
1後,指標內儲存的位址值不並不一定會加
1,這就取決於指標的型別,比如指標型別為
int,指標加
1,位址值將會加
4,這個
4是根據型別大小所得到的值。
type* p;
p+n的目的位址
= 首位址
+ sizeof(
指標型別
type)*n;
兩指標相加是沒有意義的,但兩指標相減可以計算兩位址之間的元素的個數。
引用:
● 引用的定義用「
type&
」,type
為資料型別,在
c++中不可以單獨定義,在定義時要進行初始化。引用表示乙個變數的別名,對它的任何操作,本質就是在操作它所表示的變數。 ●
實際上,引用型別就是指標型別,只不過它用於存放位址的記憶體空間對使用者是隱藏的。
常量在程式執行前就已經存在,它們被編譯到可執行檔案中。當程式啟動後,它們便會被載入進來。
這些資料通常都會在常量資料區中儲存
,該節區的屬性是不可寫的,所以在對常量進行修改時程式會報錯。
常量的定義:
可以使用巨集機制
#define
定義常量,也可以使用
const
將變數定義為乙個常量。常量必須初始化。
與其他變數不同,除非特別說明,在全域性作用域宣告的
const
變數是定義該物件的檔案的區域性變數。此變數只存在於那個檔案中,不能被其他檔案訪問。通過指定
const
變更為extern
,就可以在整個程式中訪問
const
物件。
#define
和const
的區別是什麼?
#define
是乙個真常量,而
const
卻是由編譯器判斷實現的常量,是乙個假常量。在實際中,使用
const
定義的常量,最終還是乙個變數,只是在編譯器內進行了檢查,發現有修改則報錯。
由於編譯器在編譯期間對
const
變數進行檢查,因此被
const
修飾過的變數是可以修改的。利用指標獲取到
const
修飾過的變數位址,強制將指標的
const
修飾去掉,就可以修改對應得資料內容。
c語言重溫筆記 2 資料型別
今天談談資料型別,算是比較基礎的問題,至於具體的內容,詳見 裡面介紹的挺全面的,我也就不多說明了。下面講講幾點常見錯誤。include include void main 看下輸出結果。發現判斷語句列印了 這句。這確實有點有違常理,明明運算後結果一樣,但是比較後就是不一樣。再看最後乙個printf語...
C 之資料型別
c 之資料型別 c 中的資料型別總的來說可以分為兩大類 1.值型別 常見值型別為 int double float char 結構體等 2.引用型別 如使用者定義的類 介面 字串等 以下簡介幾個常用基本型別 int double float char string這些都是關鍵字,是微軟為了方便定義的...
c之資料型別
在 c 語言中,資料型別指的是用於宣告不同型別的變數或函式的乙個廣泛的系統。變數的型別決定了變數儲存占用的空間,以及如何解釋儲存的位模式。c 中的型別可分為以下幾種 序號型別與描述 1基本型別 它們是算術型別,包括兩種型別 整數型別和浮點型別。2列舉型別 它們也是算術型別,被用來定義在程式中只能賦予...