C++中一个 char 的大小和一个机器字节一样。
有其他的一些字符类型(如wchar_t, char16_t, char32_t, wchar_t)用于扩展字符集,用于确保可以存放机器最大扩展字符集中的任意一个字符,如char16_t和char32_t为Unicode字符集服务(Unicode是用于拜师所有自然语言中的字符标准)
可寻址的最小内存块称为“字节(byte)”,储存的基本单元称为“字(word)”,在c++语言中,一个字节要至少能荣天娜机器基本字符集中的字符。大多数机器的字节有8比特构成,字则由32或64比特组成,也就是4或8个字节。
无符号类型只能表示大于等于0的值。
书上的经验——如何选择数据类型
- 当确定数值不可能为负数时,选用无符号数
- 算术表达式中不要用char和bool,因为类型char在一些机器上是有符号的,而在另一些机器上没有符号的,如果需要使用一个不大的整数,明确指定它的类型是signed char 和 unsigned char。
- 执行浮点数运算时选用double,这是因为float经常精度不够而且double和float的计算代价相差无几,对某些机器来说,前者甚至比后者还要快。long double运行时的消耗不小。
当把一个整数值赋值给浮点类型时,小数部分记为0。如果该整数占的空间超过了浮点类型的容量,精度可能会丢失。
当我们赋给无符号类型一个超出它表示范围的的值时,结果是初始值对无符号类型表示数值总数取模后的数。例如:unsigned char c = -1; //假设char占8个比特,c的值是255。
在这里,8比特大小的unsigned char 可以表示0到255区间的值,如果我们赋一个区间以外的值,则实际的结果是该值对256取模后的所得余数。
当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的(undefined)。此时,程序可能继续工作、可能崩溃、也可能生成垃圾数据。例如:signed char c2 = 256; //假设char占8个比特,c2的值是未定义的。
如果把 int 的尺寸看成一个确定不变的已知值,程序就不可移植了(nonportable)。
unsigned u = 10;
int i = -42;
cout << i + i << endl;
cout << u + i << endl; //如果int占32位,输出4294967264
在第二个输出表达式中,相加前首先要把整数-42转成无符号数。
两个非符号类型数相减,如果结果为负数,那么其结果也要被转为非符号数。