问 0x7FFFFFFF+0x7FFFFFFF 是多少

本文通过实例解释了在C#中进行整数运算时发生溢出的原因及表现形式,并介绍了不同整数类型的最大值及其二进制表示。

今天做面试题 问 0x7FFFFFFF+0x7FFFFFFF 是多少 一时没想明白,回家补了一下,记录下来 

int a,b

a=b=0x7FFFFFFF 
Console.WriteLine(a+b)

原来 

一个F就是4个bit,两个FF就是一个字节(byte)

0x7F 对应 sbyte.MaxValue 即 127   7对应比特为0111,F对应比特为1111,所以0x7F=0111 1111

0xFF 对应 byte.MaxValue 即 255

0x7FFF 对应  short.MaxValue 即 32767

0xFFFF 对应  ushort.MaxValue 即 65535

0x7FFFFFFF 对应 int.MaxValue 即 2147483647

0xFFFFFFFF 对应 uint.MaxValue  即  4294967295

注意C#里  byte类型范围是 0-255  sbyte类型有符号位 -128~127


这个是计算机里的基础,
答案是 -2
为什么呢 

都是最大值直接用sbyte.MaxValue 来说

0111 1111
+ 0111 1111
= 1111 1110
符号位溢出了
取反
1000 0001
再加1
1000 0010
结果就得-2 

这只是示意
C#里sbyte+sbyte是没问题的 因为 + operator 默认是int类型实现的 int才会溢出
也发现C# a=int.MaxValue,b=int.MaxValue a+b 默认就是-2 也是就是默认是unchecked()的
直接用 int.MaxValue+int.MaxValue 编绎器过不了 unchecked()(int.MaxValue+int.MaxValue)这样就好了

一个byte 8个bit 
0111 1111 有符号sbyte类型最高位bit用来标记是正还是负 0正 1负
所以真正能存数的只有7个bit 那它的大小是  2^0+2^1+2^2.....2^6=127
负数最大值是 1000 0000 先-1 即 0111 1111 再取反 1000 0000 转成2进制 2^7=128 其它位的0
 
符号为1时 这里有个操作叫 补码 
补码 0与正数不变 当符号位是1是 除最高位其它7个bit先取反(反码)再加1
比如 0-1
默认先补码 0000 0001先反转1111 1110 再加1即 1111 1111
计算机再算的时候成了 0+(-1) 直接算


参考:byte的范围为何是-128到127 
参考: 补码 
参考: 补码2 
参考: java中为什么byte的取值范围是-128到+127 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值