重溫C 之資料型別

2021-09-07 23:27:59 字數 4323 閱讀 9449

測試環境:

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列舉型別 它們也是算術型別,被用來定義在程式中只能賦予...