【C++ Primer】2.1 基本内置类型
1. 基本内置类型
基本算数类型:
类型 | 含义 | 最小尺寸 |
---|---|---|
bool |
布尔类型 | 8bits |
char |
字符 | 8bits |
wchar_t |
宽字符 | 16bits |
char16_t |
Unicode字符 | 16bits |
char32_t |
Unicode字符 | 32bits |
short |
短整型 | 16bits |
int |
整型 | 16bits (在32位机器中是32bits) |
long |
长整型 | 32bits |
long long |
长整型 | 64bits (是在C++11中新定义的) |
float |
单精度浮点数 | 6位有效数字 |
double |
双精度浮点数 | 10位有效数字 |
long double |
扩展精度浮点数 | 10位有效数字 |
2. 如何选择类型
- 1.当明确知晓数值不可能是负数时,选用无符号类型;
- 2.使用
int
执行整数运算。一般long
的大小和int
一样,而short
常常显得太小。除非超过了int
的范围,选择long long
。 - 3.算术表达式中不要使用
char
或bool
。 - 4.浮点运算选用
double
。
3. 类型转换
- 非布尔型赋给布尔型,初始值为0则结果为false,否则为true。
- 布尔型赋给非布尔型,初始值为false结果为0,初始值为true结果为1。
3.1 无符号整型接收超出范围的值(例如负数时):
数据以补码形式存放,-1补码为1111 1111
unsigned char视-1的补码为正数,而正数的原码、反码、补码都是一样的。因此1111 1111被解析为255.
因此c的值为255%256 = 255
练习:
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl;
std::cout << u - u2 << std::endl;
输出:
32
4294967264
/*
*-32
*补码:
*1111 1111 1111 1111 1111 1111 1110 0000
*无符号时,十进制为:2^32 - 1 - (16+8+4+2+1) = 4,294,967,264
* 4,294,967,264 % 4,294,967,296 = 4,294,967,264
*/
字面值常量
-
一个形如
42
的值被称作字面值常量(literal)。- 整型和浮点型字面值。
- 十进制字面值不会是负数。
个人理解:十进制字面值没有用unsigned类型存储,因此如果存负数,则正数的表示范围比八进制和十六进制的少一位符号位
-
字符和字符串字面值。
-
使用空格连接,继承自C。
-
字符字面值:单引号,
'a'
-
字符串字面值:双引号,
"Hello World"
-
分多行书写字符串。
std:cout<<"wow, a really, really long string" "literal that spans two lines" <<std::endl;
-
-
转义序列。
\n
、\t
等。 -
布尔字面值。
true
,false
。 -
指针字面值。
nullptr
字符串型实际上时常量字符构成的数组,结尾处以
'\0'
结束,所以字符串类型实际上长度比内容多1。