C#基础蛋疼到爆的Byte类型表数范围之网兜毛衣见解……

来源:互联网 发布:我的世界java停止工作 编辑:程序博客网 时间:2024/04/28 06:41

其实写这篇对Byte类型表数范围的文章,真的是蛋疼+蛋疼+蛋疼,每每看到Byte表数范围这一块,都对-128如此的陌生与迷茫,操蛋的Byte,操蛋的人生……

熊孩子出场:Byte

恶作剧结果:表数范围(-128-------127)

蛋疼原因:上了个不太好的大学,在计算机组成原理课上,老师也在原码、反码、补码中神游……

决心重新做人:曾经有一个Byte摆在我面前让我去爱上她,可是我没有珍惜,如果上天再给我一篇博客,我决定对她说:“我要为你写一万遍……”

1)难点在于为何表数范围为-128-----127?不懂,不懂,还是不懂。

127好理解,就是01111111,但为何-128是10000000???你妈这倒底是为什么……

2)下面就谈一谈我个人的一些思路(大神请赶紧踩我参与讨论呀)

一:穷举

Byte八位数穷举太复杂,举例三位二进制。

100,101,110,111,000,001,010,011,表数范围为2的3次方是8.(注意,这里的100就相当于Byte穷举后的10000000)

因为计算机中的所有数全是由补码的形式来表示,所以100,101,110,111,000,001,010,011全是补码。

先看正数:000的十进制为0,001的为1,010的为2,011的为3.即三位二进制的正数范围为0,1,2,3.

再看负数的补码:100,101,110,111.(关键来了,希望各位同僚注意看)

101的十进制数为-3,110的为-2,111的为-1

再看100!!!根据穷举来看,100只能代表-4.

由例子转到Byte,Byte正数范围表示为0----127(00000000------01111111),负数范围表示为-128至-1(10000000------11111111)

二:再讨论10000000为何代表-128?

有人说了,你不前边对8位二进制穷举算出来10000000是-128吗?确实是这样,但如果用我们伟大的原码、反码、补码来算出来的话,那更有说服力是吧!

下面就开始算补码10000000的十进制数是多少。(要按正常的方法算是符号位1不变,其余7位取反然后末位加1得原码,这样算出来还是10000000,难道十进制数为-0?

很可惜,至少在我们地球上还没有负0这个说法。那么10000000是如何算出-128的呢?

计算过程:保留符号位1,其余7位0000000取反加1为10000000,加上符号位1,最后得出的原码是110000000,但计算中有一个规则,就是超出8位的部分自动丢弃,所以就变成了10000000,为128,得出的是正数值128,但原先的10000000是负数,则为-128.

算出来啦……

(更正错误……在C#中,sbyte表示带符号8位整数类型,byte则表示无符号整数类型,所以在此……以上对-128~127的讨论仅针对sbyte数据类型,切记!!!)


0 1