摘自《C++ Primer(中文版)》(第五版)
-------仅作为个人学习笔记之用。
//**************************************************************************************************************
带符号类型和无符号类型
除去布尔类型和扩展的字符型之外,其他整型可以划分为带符号的(signed) 和 无符号类型(unsigned) 两种。
带符号类型可以表示正数、负数或0,无符号类型仅能表示大于等于0的值。
//*********只有整型才有符号型和无符号型之分,浮点型无此区别
类型int 、short 、 long 和 long long 都是带符号的,通过在这些类型名前添加unsigned就可以得到无符号类型,
例如 unsigned long 。类型 unsigned int 可以缩写为 unsigned 。
与其他整型不同,字符型被分为了三种:char 、 signed char 和 unsigned char。特别注意的是:类型 cahr 和 类型 signed char 并不一样。尽管字符型有三种,但是字符型的表现形式却只有两种: 带符号和无符号的。类型char实际上会表现为上述两种形式的一种 ,具体是哪种由编译器决定。
//**************char 并不一定是我们平时默认的那样。。。。
无符号类型中所有比特都用来存储值,例如,8比特的unsigned char 可以表示0至255区间内的值。
C++标准并没有规定带符号类型应如何表示,但是约定了在表示范围内正值和负值的最应该平衡。因此,8比特的signed char 理论上应该可以表示-127至127区间内的值,大多数现代计算器实际的表示范围定位 -128 至 127
//***************************************可以理解为:因为把0划分到了无符号类型,所以0+127 = 128.
有意思的代码:
unsigned char c = -1;
signed char c2 = 256;
这两个语句的运行结果是(均假设cahr占8比特):
c的值为255,
c2的值是未定义的。
REASON:
1.当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。例如,8比特大小的unsigned char 可以表示0至255区间内的值,如果我们赋了一个区间意外的值,则实际的结果是该值对256取模后所得的余数。因此,把-1赋给8比特大小的unsigned char 所得的结果是255.
2.当我们赋给符号类型一个超出它表示范围的值时,结果是未定义的(undefined)。此时,程序可能继续工作、可能崩溃,也可能生成垃圾数据。