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%6 = 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" <
转义序列。\n
、\t
等。
布尔字面值。true
,false
。
指针字面值。nullptr
字符串型实际上时常量字符构成的数组,结尾处以
'\0'
结束,所以字符串类型实际上长度比内容多1。