1. 程式人生 > >c++基本資料型別的範圍

c++基本資料型別的範圍

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進位制轉