資料在記憶體中的儲存都是以二進位制形式存放,而數值型資料又主要是以補碼(例如char,short,int,long型資料)或浮點數(例如float,double型資料)形式存放的。在機器語言中,根本不會也沒能力區分數值型資料的型別(後簡稱「資料型別」),在它看來全部都是一串二進位制資料,具體要提取多少位來計算,是通過執行指令來指定的。在c/c++語言中會區分資料型別,其主要有有以下幾種用途:
1:分配記憶體空間。例如:
char a = 0x45;//在記憶體中分配了乙個位元組,內容為:01000101,如果以字元型讀出printf(」%c\n」,a),將會輸出字元e,其實字元最終是以ascii格式存放在記憶體中的。char b = 『e』; //和上一語句效果相同。
int c = ox85;//在記憶體中分配了四個位元組,內容為:00000000 00000000 00000000 100001001。
2:指定擴充套件方式。因為在c語言中資料型別(僅限補碼形式表示的,浮點數則不是)包括「有符號數」和「無符號數」兩種,例如:
char a = 0x85;//在記憶體中為:10000101,如果此時printf(」%c\n」,a),將會輸出空值,因為ascii碼得最大值是:7f。char b = 0x76; //在記憶體中為:00100110,
int c = a + b;//這裡的int型也可以換成char型,只不過會截斷成一位元組而已。
此時c的值是多少呢?是0xab嗎?
注:這裡有個運算規則:字元型進行計算時,會先將其轉化為整型(或者說擴充套件成四位元組更準確些)。
正確答案是:0xffffffab。這是為什麼呢?
這就是擴充套件方式的原因。我們將上面**轉換成彙編(在vs2008下生產)語言,如下:
chara = 0x85;
004113ce mov byte ptr [a],85h
charb = 0x26;
004113d2 mov byte ptr [b],26h
intc = a + b;
004113d6 movsx eax,byte ptr [a]
004113da movsx ecx,byte ptr [b]
004113de add eax,ecx
004113e0 mov dword ptr [c],eax
我們可以看到a和b進行了符號擴充套件,因為a,b是有符號數,在暫存器eax中儲存的是1111111111111111 11111111 10000101(對應a),在暫存器ecx中儲存的是00000000 00000000 00000000 00100110(對應b),注:符號擴充套件是根據擴充前數值的最高位的值進行擴充套件,如果最高位為1,高位則填充1,為0則填0;
好了,我們看一下下面這段**,情況又如何呢?
unsigned char a = 0x85;
unsigned char b = 0x26;
int c = a + b;
c的值為多少?
此時的正確值為:0x000000ab,我們再看一下彙編**:
unsignedchar a = 0x85;
004113ce mov byte ptr [a],85h
unsignedchar b = 0x26;
004113d2 mov byte ptr [b],26h
intc = a + b;
004113d6 movzx eax,byte ptr [a]
004113da movzx ecx,byte ptr [b]
004113de add eax,ecx
004113e0 mov dword ptr [c],eax
此時a,b進行的是零擴充套件,因為a,b是無符號數。零擴充套件即是無論最高位是什麼,都填充0;此時在暫存器eax中儲存的是00000000 00000000 00000000 10000101(對應a),在暫存器ecx中儲存的是0000000000000000 00000000 00100110(對應b)。
3:指定資料值的解釋方式,但不能指定計算方式。例如如下**:
char a = 0x85;
char b = 0x26;
(type)c = a + b;//例如type的值為int,unsignedint ,char(同樣,只不過是截斷而已)。
無論c是什麼型別,a + b這個表示式都是執行將a的二進位制數值與b的二進位制數值進行簡單的相加。至於得到的結果是什麼?就看你賦給的型別是什麼了,不同的型別會將同樣的二進位制數值串解釋成不同的值。
無論c的型別是什麼,c中的值都是0xffffffab(即二進位制**11111111 11111111 11111111 10101011),但如果c的型別若是int,那麼他會將值解釋成-85(十進位制),如果c的型別若是unsigned int,那麼他會將值解釋成4294967211(十進位制)。
總之,c/c++中的資料型別是用來指導編譯器該如何生成機器**,到機器**層次後,資料型別便不會再被區分。
C C 資料型別
由於對各種資料型別的長度記憶有點亂,便整理下用到的資料型別,方便查詢與記憶。一 資料型別介紹如表 二 說明 1 型別修飾符signed和unsigned用於修飾字元型和整形。2 型別修飾符short和long用於修飾字元型和整形。3 當用signed和unsigned short和long修飾int...
c c 資料型別轉換
c c 資料型別轉換1 float,char,string,cstring unicode 統一碼 萬國碼 單一碼 是一種在計算機上使用的字元編碼。它為每種語言中的每個字元設定了統一並且唯一的二進位制編碼,以滿足跨語言 跨平台進行文字轉換 處理的要求。1990年開始研發,1994年正式公布。隨著計算...
C C 資料型別長度
我們在編寫 c c 時肯定希望在32位和64位系統都能正常執行,那麼我們就需要注意基本資料型別的長度在32位與64位中的變化 另外這種變化還與編譯器相關。64位 gcc 是 lp64 即 long 和 pointer 是64位,具體的 gcc 編譯器 32 位 64位 char 1 1short 2...