c++基本資料型別的範圍
阿新 • • 發佈:2018-12-11
1> 怎麼計算一個型別的範圍?
- 以前大學學的8086是16位的暫存器,現在32,64的都有了;那麼現在看看資料型別單位是位元組(8位)也是合理的,提高效能,便於位元組對齊,提高記憶體訪問效率。 c++位元組對齊
- 現在知道了基本型別肯定都是8的倍數,而且從規定上看還都是偶數倍(除了它本身==),為什麼呀?想一想,偶+偶=偶,奇+偶=奇,如果記憶體是按16位對齊的,只要有奇數倍,肯定會浪費,而且浪費的你還管不了;你把奇數倍加多,變偶數倍,這樣就不會浪費了,而且相比奇數倍浪費的部分,現在都在我們掌控之中。(以上以下都是我個人看法~)
- 至於為什麼沒6倍的,都是1、2、4、8倍的,我覺得有2個原因:
- 從數學上看,有了1,2,4,8可以得到1-15中的任何一個數,因此他們是可以作為基的。而且我們可以發現隨著作業系統位數的增長,也只需要新加一下資料型別,打個比方,我們可以為128位作業系統創造一個BIG LONG:16位元組,哈哈。
- 程式設計師只認二進位制,哈哈,這幾個數能幹的事,為啥還要加別的,程式設計師乾的事不就是讓世界變簡單嗎?哈哈~
- 那怎麼算資料的範圍呢?
- 首先,沒有unsigned的資料型別就一定是有符號數,先算他有多少位
有無符號 | 位元組數 | 位數 | 範圍 |
---|---|---|---|
int | 4 | 32 | -2^31 ~ 2^31-1 |
unsigned int | 4 | 32 | 0 ~ 2^32-1 |
- 上面這個例子可以很好的說明,有符號數是正負個一半,因為有0,所以正數的最大是一半減1
- 有符號,正負分一半;無符號,正:(大龍小龍藍紅buff)我都要,哈哈~
2> 常見的c++資料型別的位元組數
- 不同(位數)的機器,有些型別的結果可能不一樣,可以用sizeof(int)、sizeof(long long)打印出來看一下。
- 我的機器64位
資料型別 | 位元組數 |
---|---|
bool | 1 |
(unsigned )(signed)char | 1 |
(unsigned)(signed)short int | 2 |
(unsigned)(signed) int | 4 |
float | 4 |
long long | 8 |
(unsigned)(signed)long int | 8 |
double | 8 |
long double | 16 |
型別修飾符: signed unsigned short long
- 從上表我們可以看出signed、unsigned修飾過後,位元組數不變,表示範圍改變;short 修飾後位元組數變小為一半,long變大為一倍。這4個修飾符都可以修飾int,部分也可以組合。
在標準中,並沒有規定long一定要比int長,也沒有規定short要比int短。 標準是這麼說的:長整型至少和整型一樣長,整型至少和短整型一樣長。 這個的規則同樣適用於浮點型long double至少和double一樣長,double至少和float一樣長。 至於如何實現要看編譯器廠商.
3> 一些常見windows資料型別
引言
- windows資料型別也是由這些基本型別再次包裝改名而已,不應該被千奇百怪的名字嚇到(曾經瑟瑟發抖)
windows程式設計常用的資料型別
資料型別 | 對應的基本型別 |
---|---|
HWND | HWND_* |
wchar_t | 寬字元 |
LPSTR 、PSTR | char* |
LPCSTR 、PCSTR | const char* |
LPWSTR 、PWSTR | wchar_t* |
LPCWSTR、PCWSTR | const wchar_t* |
- 從上表可以看出來,LP和P為字首定義的是一個東西
字串轉換成視窗控制代碼HWND
- CString轉換成視窗控制代碼HWND
CString hwnd = _T("000107C2");
TCHAR* offset;
HWND appHandle = (HWND)wcstol(hwnd.GetBuffer(),&offset,16);
- std::wstring轉換成視窗控制代碼HWND
std::wstring s("000107C2");
TCHAR* offset;
HWND appHandle = (HWND)wcstol(hwnd.c_str(),&offset,16);//按16進位制轉
wchar_t* 轉換成UINT64
wchar_t* str = _T("123344");
UINT64 num = _wcstoui64(str,NULL,10);//按10進位制轉