有符號數
有符號整數中用來表示符號的是最高位,最高位為0表示正數,最高位為1表示負數。在內存中同樣占4個字節,由於最高位為符號位,不能用於表示數值,因些有符號整數的取值范圍要比無符號數取值范圍少1位,
既0x80000000~0x7FFFFFFF;
負數在內存中都是以補碼的形式存放。
補碼:
正數的補碼是其本身
負數的補碼:先求其相反數的補碼,然后對該補碼的二進制逐位求反,最后加 1。
-10
10二進制:1010
擴展為32位:1000,0000,0000,0000,000,0000,0000,1010 最高位為符號位
補碼: 1111,1111,1111,1111,1111,1111,1111,0101 + 1
=1111,1111,1111,1111,1111,1111,1111,0110
=0xfffffff6
x + x(反碼) + 1 = 0
補碼 = 0 - x = x(反碼) + 1
-69DA H
二進制: 1000,0000,0000,0000,0110,1001,1101,1010 B
按位求反:1111,1111,1111,1111,1001,0110,0010,0101 B
加一: 1111,1111,1111,1111,1001,0110,0010,0110 B
f f f f 9, 6, 2, 6 H
6 9 D A
+ ? ? ? ? (9625H)
--------------------
F F F F
浮點數
在C++中,使用浮點方式存儲實數,用兩種數據類型來保存浮點數:float(單精度)、double(雙精度)。Float在內存中占4個字節,double在內存中占8字節空間。
浮點數的編碼方式
浮點數編碼轉換采用的是IEEE規定的編碼標准,float和double這兩類型數據的轉換原理相同。IEEE規定的浮點數編碼會將一個浮點數轉換為二進制數。以科學記數法划法,將浮點數拆分為3部分:符號、指數、尾數。
float類型的IEEE編碼
float類型在內存中占4個字節(32位),最高位用於表示符號;在剩下的31位中,從右向左了8位用於表示指數,其余用於表示尾數。如圖:
正指數情況
例:將float類型10.625轉換為IEEE編碼,需要將10.625轉換成對應的二進制數(10.625 * 2^3 = 85 (1010101)):1010.101,
整數部分為1010,小數部分為101;然后對單精度數進行科學記數法轉換:將小數點向左移動,每個移動1次指數加1,移動到除符號位的最高位為1處,停止移動,這里移動3次(移動多少次指數部分就是多少)。
對10.625進行科學記數法轉換后二進制部分為1.010101,指數部分為3。在IEEE編碼中,由於在二進制情況下最高位始終為1,為一個恆定值,故將其忽略不計。
這里是一個正數,所以符號位為0,指數部分:由於指數部分可能出現負數,十進制數127可表示為二進制數01111111。
IEEE編碼方式規定,當指數小於01111111時為一個負數,反之為一個正數。
10.625經IEEE轉換后各位的情況如下:
符號位:0
指數位:3+127(十進制),轉為二進制 10000010
尾數位:01010100000000000000000(當不足23位時,低位補0填充)
10.625轉換后的IEEE編碼按二進制拼接為:01000001001010100000000000000000
轉換成十六進制數為:0x412A0000,由於內存以小尾方式進行排列,故為:00 00 2a 41
負指數
-0.8125經IEEE轉換后各位的情況如下:
-0.8125的二進制為-0.1101
符號位:1
指數位:-1+127(十進制),轉為二進制 01111110(如果不足8位,高位補0)
尾數位:10100000000000000000000(當不足23位時,低位補0填充)
-0.8125轉換后的IEEE編碼按二進制拼接為:10111111010100000000000000000000
轉換成十六進制數為:0xBF500000,由於內存以小尾方式進行排列,故為:00 00 50 BF
如果小數部分轉換為二進制時得到一個無窮值,則根據尾數長度舍棄多余部分。
Double類型的IEEE編碼
Double類型的和float類型大同小異,只是double類型表示的范圍更大,占用的空間更多,是float類型所占空間的兩倍。
double類型:指數用11位正數表示,加上1023用於指數符號判斷。
字符編碼
在C++中,字符的編碼格式分兩種:ASCII和Unicode.
ASCII編碼在內存中占一個字節大小,只能表示26個字母和常用符號。
Unicode編碼在內存中占兩個字節大小,表示的范圍是0~65535.
在Microsoft Visual C++ 6.0中,使用char定義ASCII編碼格式的字符,使用wchar_t定義Unicode編碼格式字符。
#include <iostream> void fun(bool flag) { if (flag) { printf("hello world\n"); } else { printf("sorry.\n"); } //int a = 0, b = 4; //int c = b / a; } int main() { bool m = false; unsigned int a = 10; int b = -10; float c = 10.625; fun(m); const char *p = "Hello World!\n"; const wchar_t* w = L"hello Unicode"; system("pause"); return 0; }