今天做面试题 问 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
本文通过实例解释了在C#中进行整数运算时发生溢出的原因及表现形式,并介绍了不同整数类型的最大值及其二进制表示。

1万+

被折叠的 条评论
为什么被折叠?



