8種基本數據類型(32位系統)
byte | char | short | int | long | float | double | boolean |
---|---|---|---|---|---|---|---|
1 | 1 | 2 | 4 | 4 | 4 | 8 | 1(字節) |
舉例:
int a=0xFFFFFFF7;
char *p=(char*)&a;
- &a表示取a的地址,得到的指針類型應該是
int *
,然後將該指針類型強制轉換爲char *
; - p++:此時移動的距離不爲4個字節,而是1個字節,
*p
和*(char*)&a
的輸出均爲0xFFFFFFF7,這裏是char類型的指針的轉換,而不是char類型的轉換。
強制類型轉換
a = 1.0f;
(int)&a; //表示將a的地址強制轉換爲十進制的整型,結果爲1245052;
(int&)a; //表示將a的引用強制轉換爲整型,a以float類型存儲在內存中,現在以int類型的方式去解釋這段內存;
在C++,float是用4個字節來存儲。其中有1位符號位,8位指數位和23位有效數字位。實際上有效數字位是24位,因爲第一位有效數字總是“1”,不必存儲。
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
//S: 表示浮點數正負,1爲負數,0爲正數
//E: 指數加上127後的值的二進制數
//M: 24-bit的底數(只存儲23-bit)
所以1.0f 在內存中的形式爲:
0011 1111 1000 0000 0000 0000 0000 0000
輸出的是 0x3f800000
0 在內存中的的存儲形式:
0000 0000 0000 0000 0000 0000 0000 0000
字符串和字符串字面值
1、字符串字面值實際上是由常亮字符構成的數組,編譯器在每個字符串結尾處都添加一個空字符(’\0’)。
2、如果兩個字符串字面值位置相鄰,並且由空格、縮進、換行符分隔,則他們實際上是一個整體。
std::cout<<"hello"
"world";
類型別名
當類型名過於複雜時,可以自定義類型的別名以便於理解和使用。
(1)typedef
typedef double wages; //wages是double的同義詞
(2)using(C++11)
using double = wages; //將=左邊的名字規定爲=右邊的別名
auto類型說明符(C++11)
auto讓編譯器通過初始值來推斷變量的類型,因此auto定義的變量必須初始化。
decltype類型說明符(C++11)
返回操作數的數據類型,但是不實際計算表達式的值。例如:
decltype(f()) sum = x;
//用f()的返回類型作爲sum的類型,但是不調用f(),用x來初始化sum
如果decltype使用的表達式不是一個變量,那麼decltype返回表達式結果所對應的類型。
int i = 42, &r = i, *p = &i;
decltype(i) sum; //返回int
decltype(r) sum; //返回int&,必須初始化
decltype(*p) sum; //返回int&,必須初始化
decltype((i)) sum; //返回int&,必須初始化