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

事实上写这篇对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数据类型,切记。!

!)

时间: 2024-10-03 23:10:05

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

JavaSE7基础 强制转换 int->byte(int变量的数值在byte类型范围内)

jdk版本  :jdk-7u72-windows-i586系统     :Windows7编辑器   :Notepad++ v7.4.2注意事项 :博文内容仅供参考,不可用于其他用途. 代码 class Demo{ public static void main(String[] args){ int a=3; /* byte b=a+1; 这样写会提示 需要byte,找到int */ byte b=(byte)(a+1);//强制转换,可能会有精度损失问题 } } 还有的情况是:int类型变量

Java基础学习1-Java标识符及基本类型

暑假闲来无事,重新学习Java,希望能够加深自己对Java的理解与深入. 第一天,从Java标识符开始. Java标识符的命名规则 - 标识符必须以字母.下划线.美元符$开头. - 标识符其它部分可以是字母.下划线.美元符$和数字的任意组合. - Java标识符的大小写敏感,无长度限制(但是也不要太长,会变成裹脚布的(/ □ \)). - 不可以是Java的关键字(这点只要是有点基础的都会知道啦,Java的关键字还挺多的哦,小心踩到地雷呀). 下面是一个小栗子. /* *测试标识符的写法 */

int类型和byte类型的强制类型转换

今天在读<Java网络编程>这本书的第二章 流 时,看到书中有一个地方关于int强制转换为byte类型时应注意的地方.这个地方有点细节,不过就应该把这种细节把握住. 情况是这样的,讲到InputStream的抽象方法read时,说到read返回一个int型,但实际是一个byte型的数据.这点从API也能考证.如图: 那么问题来了,int占4个字节,byte占1个字节,我们循环读取的时候将int型数组强制类型转换成byte时,会发生什么情况呢?代码如下: 1个字节占8位,既然实际返回的是byte

Java byte 类型的取值范围是-128~127

为什么Java byte 类型的取值范围是-128-127 : http://blog.163.com/[email protected]/blog/static/47517863200911314245752/ java基本数据类型的取值范围: http://www.cnblogs.com/singlesoar/p/5688915.html

C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字节的值,该如何在它上面调用方法? 二:值类型转换为引用类型--装箱 2.1CLR对值类型进行装箱时:新分配托管堆内存,将值类型的实例字段拷贝到新分配的内存中,返回托管堆中新分配对象的地址.这个地址就是一个指向对象的引用. int i = 10; Object obj = i; 三:将引用类型转换为值

java里int类型转byte类型

今天在做书上的一个例子的时候, 要使用byte类型,首先我很直接的就写到了byte b = 0XAA, 结果报错, 说从int转换到byte可能会有损失. 我当时就很奇怪, 为什么会出现这种情况呢? 0XAA转化为10进制的byte类型就是-86, 并没有超出-128~127的范围.而且如果直接赋值byte b = -86 ; 也是正常通过. 经过网上一位前辈的教导, 现在有了这样的结论: 在计算机中是没有正负数的区分的, 所有的正负数都是人为规定的 byte类型的最小值-128二进制位1000

Java零基础系列002——命名、变量类型、类型转换、JDK中二进制整数和数字分隔符新特性

public class BasicDataType { public static void main(String[] args) { /* * 标示符:用于给变量.方法.类命名,必须以字母.下划线.$符号开头.以字母.下划线.数字.$符号组合,且不能为关键字 * * * */ System.out.println("--------------标示符------------"); int $,_,a;//正确的命名 int 彭驰=12;//由于Java内部采用Unicode编码方

什么样的数据算是byte类型,int类型,float类型,double类型,long类型

byte类型,就是字符类型.这类数据是字符组成的 INT 类型,为整型数字,不同语言定义的范围不同 FLOAT,为数字浮点型,其小数点后面可以跟N个数字 DOUBLE,为双精度数字类型,其小数点后只能有两个数字 LONG,为长整型其范围要比INT类型范围广 什么样的数据算是byte类型,int类型,float类型,double类型,long类型

Java 中 byte 类型初始化问题

很早的时候由于工作需要,接触过一点 Java,于是有了这个坑,今天回头看到自己在 Stackoverflow 上提的问题发现了它,于是再记录下. 在使用中,需要将 byte 类型的的每一位都置 1.我万万没有想到这么一个简单的操作,在 Java 中有各种约束. 首先看看代码: // 方式 1 byte allBitsOne = 0xFF; // 方式2 byte allBitsOne = (byte)0xFF; // 方式3 byte allBitsOne = 0xFFFFFFFF; 上面的哪个