无符号和带符号的定义

带符号类型可以表示正数,负数或0,无符号类型仅能表示大于等于0的值

类型转换的规则

  1. 如果带符号类型前面加了unsigned int,那么就会变成无符号类型
  2. 当一个算术表达式中既有无符号数又有int值时,那个int值就会转换成无符号数,把int转换成无符号数的过程和把int直接赋给无符号变量一样
  3. 如果表达式里既有带符号数又有无符号数,带符号数会自动转换成无符号数

既然如此

unsigned a=-1;
std::cout<<a<<std::endl;
unsigned b=2;
std::cout<<b<<std::endl;

结果为

java8位无符号数据类型_带符号

  • 当我们给无符号类型赋给一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数
  • 当我们给带符号类型赋给一个超出它表示范围的值时,结果是为定义的,此时程序可能崩溃,也可能继续工作,也可能生成垃圾数据
  1. 从数学角度
    所谓无符号表示数值总数取模后的余数,
    就是 (这个值加上无符号数的计量范围)%计量范围=输出结果

比如在在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的原码: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个
如果负数转无符号则取模后的余数