问 0x7FFFFFFF+0x7FFFFFFF 是多少

今天做面试题 问 0x7FFFFFFF+0x7FFFFFFF 是多少 一时没想明白,没办法就是这么水,回家补了一下,记录下来 
int a,b

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

0x7FFFFFFF 对应 int.MaxValue 即 2147483647

0xFFFFFFFF 对应 uint.MaxValue  即  4294967295

0x7FFF 对应  short.MaxValue 即 32767

0xFFFF 对应  ushort.MaxValue 即 65535

0x7F 对应 sbyte.MaxValue 即 127

0xFF 对应 byte.MaxValue 即 255

注意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 

你可能感兴趣的:(C#)