第二章 变量的基本类型
2.1 基本内置类型
- 算数类型(arithmetic type):字符、整型数、布尔值和浮点数
- 空类型(void):不对应具体值,仅用于一些特殊 场合,例如 void main,当函数不反悔任何值时使用空类型作为返回类型。
2.1.1算数类型
- 整型 :包括字符和布尔类型
- 浮点型
算数类型:
类型 | 含义 | 最小尺寸 |
---|---|---|
bool | 布尔类型 | 未定义(取值为真或假) |
char | 字符 | 8位 |
wchar_t | 宽字符 | 16 |
char16_t | Unicode字符 | 16 |
char32_t | Unicode字符 | 32 |
short | 短整型 | 16 |
int | 整型 | 16 |
long | 长整型 | 32 |
long long | 长整型 | 64 |
float | 单精度浮点数 | 6位有效数字 |
double | 双精度浮点数 | 10位有效数字 |
long double | 扩展精度浮点数 | 10位有效数字 |
基本的字符类型为char,一个char的空间应确保可以存放机器基本字符集中任意字符对应的数字值,也就是说,一个char的大小和一个机器字节一样。也就是8位。
字节 Byte
大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块称为“字节”。一般包括8个二进制位。
字 Word
字由字节构成,例如32或64比特构成,也就是4或8字节。
char和int的区别
int i=55;
cout<< i,就是55
int i = ‘abc’;
cout<< i,结果是6382179
因为’a’的ASCII值为97,内存中占一个字节8位,就是01100001,b是01100010,c是01100011.由于int是32位,不够的位用0补齐,a是高位所以存到高地址位,四个字节在内存中就是
01100011
01100010
01100001
00000000
这样读取的时候跟存入的时候正好相反,先读高地址位,然后低地址位,也就是00000000 01100001 01100010 01100011,对应的十进制数为6382179。
char i=55;
系统会根据在ASCII表中这个整型值代表的控制字符是什么,就输入什么,表中55是数字7的ASCII值,所以cou<< i,结果是7.
char i= 1 ;
cout结果为☺
char i=’1234’;
c++会认为单引号中每一个数值看作一个字符字面值,也就是说1 2 3 4各占一个字节,但是char i只占一个字节,所以会截取其中低位的’4’给i。cout结果为4.
2.1.2 类型转换
bool b=42; //b为真
int i=b; //i=1
i=3.14; // i的值为3
double pi=i; //pi的值为3.0
unsigned char c=-1; //假设char占8比特,c的值为255,也就是ASCII值,查表对应输出.
signed char c2=256; //假设char占8比特,c2的值是未定义的,因为ascii表只到255.
含有无符号类型的表达式
unsigned u=10;
int i= -42;
std::cout<< i+i << std::endl; //输出-84
std::cout<< i+u << std::endl; //如果int占32位,输出4294967264
第二个输出表达式中,相加前先把整数-42转换为无符号数。
unsigned u1 = 42, u2 = 10;
std::cout<< u1-u2 << std::endl; //结果为32
std::cout<< u2-u1 << std::endl; //结果是取模后的值,为4294967264,二进制为11111111111111111111111111100000
无符号数不会小于0!运算中如果出现负数,都要将之转化为无符号数!!
2.1.2节练习
#include <iostream>
int main()
{
unsigned u=10, u2=42;
std::cout<< u2-u << std::endl;
std::cout<< u-u2 << std::endl;
int i=10, i2=42;
std::cout << i2-i << std::endl;
std::cout << i-i2 << std::endl;
std::cout << i-u << std::endl;
std::cout << u-i << std::endl;
return 0;
}
输出结果为:
32
4294967264
32
-32
0
0
2016 12.8 一天看了两节。