无符号数类型(unsigned)和 有符号数类型的区别

无符号和带符号的定义

带符号类型可以表示正数,负数或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;

结果为
在这里插入图片描述

  • 当我们给无符号类型赋给一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数
  • 当我们给带符号类型赋给一个超出它表示范围的值时,结果是为定义的,此时程序可能崩溃,也可能继续工作,也可能生成垃圾数据
  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个
如果负数转无符号则取模后的余数

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值