C++ primer 复习 第二章 变量和基本类型
2.1 C++ 数据类型
C++的算术类型
与操作系统的位数有关
布尔
类型 | 含义 | 最小尺寸 | 说明 |
bool | 布尔 | 未定义,一般为一个字节 | 非零值为 True,零为 False |
字符型
类型 | 含义 | 最小尺寸 | 说明 |
char | 字符 | 8位 | 1个char空间应确保可存放机器基本字符集中任意字符字符对应的数字 |
wchar_t | 宽字符 | 16位 | 用于扩展字符集,确保可以存放机器最大扩展字符集中任意一个字符 |
char16_t | Unicode字符 | 16位 | 用于扩展字符集,为Unicode字符集服务 |
char32_t | Unicode字符 | 32位 | 用于扩展字符集,为Unicode字符集服务 |
整型
类型 | 含义 | 最小尺寸 | 说明 |
short | 短整型 | 16位 | |
int | 整型 | 16位 | 4字节(32位/64位)一个int至少和一个short一样大 |
long | 长整型 | 32位 | 4字节 一个long至少和一个int一样大 |
long long | 长长整型 | 64位 | 8字节 C++11定义,long long至少和long一样大 |
浮点型
类型 | 含义 | 最小尺寸 |
float | 浮点型 | 四字节(32位机),六位有效数字 |
double | 双精度浮点 | 八字节(32位机),十位有效数字 |
位 字节 字
计算机以比特(位)序列存储数据,每个比特非0即1
字节由 8 位构成, 可用于表示ASCII字符,是可寻址的最小内存块
字是计算机进行数据存储和处理运算的单位
【32位计算机:1字=32位】【64位计算机:1字=64位】
无符号类型
1、有符号整形前面加上unsigned 就可得到无符号类型,例如 unsigned long
2、unsigned int 可缩写成 unsigned
3、char 特殊,类型分为:char、signed char、unsigned char。char 是其中一种(编译器决定)
类型转换
#include<iostream>int main(){ //布尔 <-> 整型 bool b =42; //b为真 int i = b; //i为1 // 浮点 <-> 整型 i =3.0; //i为3 double pi =3.14; //pi值为3.0 // char <-> 整型 int —> char 只保留后八位 //unsigned char取值范围: 0 ~ (2^8 -1) unsigned char c =-1; //char占8比特,c为255 //signed char取值范围: -(2^7) ~ (2^7-1) signed char c2 =128; //char占8比特,c2为-128 std::cout.setf(std::ios::showpoint); //设置输出小数点后多余的0 std::cout << pi << std::endl; std::cout.unsetf(std::ios::showpoint); //恢复默认设置,即不再输出多余的0 system("pause"); return 0; }
注:char在一些机器上有符号,一些无符号
误混用符号和无符号类型
/* unsigned int和int 运算 */ unsigned u =10; int i =-42; // unsigned int和int 运算,会将int看成unsigned int,且结果也是unsigned int std::cout << u + i << std::endl; //输出 4294967264
/* unsigned char和char 运算 */ char a =-16; unsigned char b =14; std::cout << a + b << std::endl; // 输出-2 //C语言中比int小的整型(包括short 、unsigned short 、 unsigned char和char)在运算中都要转换成int然后进行运算,因为通常情况下int长度被定义为机器处理效率最高的长度。比如32位机,一次处理4个字节效率是最高的。所以虽然short(本机占2个字节)更节省内存,但是运算效率int更高。所以算术运算a + b中a、b默认转换成了int,其结果也是带符号的。 //但是需要另一个问题 : 转换int类型时,高位补齐.若unsigned类型转换成int类型,高位补0。若signed类型转换成int类型,原来最高位是1则补1,是0则补0.char c =255,在内存中为11111111,最高位是1,转换成int时高位补1,也就是11111111 11111111,就是-1.(看不懂请参考下面负数在计算机如何存储) //注 : 转换成unsigned int类型时,也是一样的
负数在计算机中如何存储
原码:10进制转换成2进制是原码,正数原码符号位为0,负数原码符号位为1(10进制1的原码是0000 0001,-1的原码是1000 0001)
反码:正数反码是本身,负数反码是负数原码0变为1,1变为0 (-1的原码是1000 0001 它的反码就是 1111 1110,负数求反时符号位不参与变换)
补码:正数补码是本身,负数补码是其反码加一 (-1的原码是1000 0001 它的反码就是 1111 1110 它的补码就是 1111 1111)
正数的原码,反码 ,补码三值合一, 负数的原码,反码,补码不同
为什么要设置反码,补码
反码补码原码是针对二进制数而言,计算机若用原码相加减,正数加正数不会出错,然而正数和负数原码相加就会出错,引进补码的作用是为了让计算机更方便做减法
补码反码是为了简化减法,将减号化为负数,再将负数化为补码求加法。计算机中所有数都是以补码形式存储的
已知一个数的补码,求原码
如果补码表示是一个负数,那么对补码取反后再加1(不改变符号位),即为原码
例:除符号位 1111001 取反为 0000110 ,再加 1 是10000111,原码即为 10000111(-7)
VS查看内存
单字节无符号整数范围是 0~255 二进制表示( 0000 0000~1111 1111)
单字节有符号整数范围是-128 ~127
正数二进制表示范围(0 000 0001 ~ 0 111 1111)即1~127
负数二进制表示范围(1 000 0001 ~ 1 111 1111)即-127~-1
所以0分为+0和-0 (0000 0000 表示+0,1000 0000 表示-0 表示-128)
注:int test = -0,其值仍为0,因为0不分正负。该处只是在说明内存中存储-128的方式
打上断点 —> 调试 —> 启动调试
调试 —> 窗口 —> 内存 —> 内存1
第一个红框输入 &test 回车,第二个红框内的数值即为16进制的内存值
16进制转二进制 0X 80 = 1000 0000 (即负0)
字面值常量
一个型如42的值就称为字面值常量
不可修改,无法对其取地址,也没有引用(因为其不是一个对象,只是一个字面值)
转义序列
通常使用转义字符表示 ASCII 码字符集中不可打印 控制字符和特定功能字符
换行符,制表符,单双引号,反斜线,回车符
泛化转义序列
指定字面值类型
附 2.1 思维导图
这一小节内容很多,单独附图,便于记忆