无符号和带符号的定义
带符号类型可以表示正数,负数或0,无符号类型仅能表示大于等于0的值
类型转换的规则
- 如果带符号类型前面加了unsigned int,那么就会变成无符号类型
- 当一个算术表达式中既有无符号数又有int值时,那个int值就会转换成无符号数,把int转换成无符号数的过程和把int直接赋给无符号变量一样
- 如果表达式里既有带符号数又有无符号数,带符号数会自动转换成无符号数
既然如此
unsigned a=-1;
std::cout<<a<<std::endl;
unsigned b=2;
std::cout<<b<<std::endl;
结果为
- 当我们给无符号类型赋给一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数
- 当我们给带符号类型赋给一个超出它表示范围的值时,结果是为定义的,此时程序可能崩溃,也可能继续工作,也可能生成垃圾数据
- 从数学角度
所谓无符号表示数值总数取模后的余数,
就是(这个值加上无符号数的计量范围)%计量范围=输出结果
比如在在32位的编译器上,unsigned int 的最大值为4294967295,再加上0,一共4294967296个整数,即32位无符号数的模为4294967296(2^32)
a为-1 ,转换为32位无符号数为 4,294,967,295
b为2,转换为32位无符号数为2(4294967296+2=2)无符号int类型范围为0~4294967296
- 从计算机角度
首先要了解原码,补码,反码
原码:第一位为符号位,其余位表示数值,如-1的原码:1,000…0001(两个1之间32个0)。
反码:正数的补码就是其原码;负数的反码为符号位不变,数值位按位取反。如-1的补码为1,111…1110。
补码:正数的补码就是其原码。负数的补码为=反码+1。因此,-1的补码为1,111…111。
因此,unsigned(-1)=1,111…111(共32个1)。表示unsigned的最大值。
个人理解
以int为例
unsigned范围为0~4294967295
一共4294967295个
如果负数转无符号则取模后的余数
以char为例
unsigned范围为0~255
一共256个
如果负数转无符号则取模后的余数