版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liunan199481/article/details/82799091
文章目录
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为前缀定义的是一个东西
字符串16进制句柄转换成窗口句柄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进制转