精华内容
下载资源
问答
  • 我的疑惑 一个字节8位,其中最高位表示正数和负数,0表示正数,1表示负数。...这样没有什么意义啊,其实表示的就是-128,但是在计算中又会出现问题,比如数学上,1+(-1)=0,而在二进制中00000001+...

    我的疑惑

    一个字节8位,其中最高位表示正数和负数,0表示正数,1表示负数。所以能够表示-128~+127。

    01111111可以表示+127。正数这一段没有问题,负数这一段有两个疑问

    11111111只能表示-127啊,还有10000000表示什么啊,难道是-0。这样没有什么意义啊,其实表示的就是-128,但是在计算中又会出现问题,比如数学上,1+(-1)=0,而在二进制中00000001+10000001=10000010,换算成十进制为-2。

    解决问题

    其实在计算机里面将正数都保存成了补码。对于正数的补码是它本身,对于负数的补码是其反码+1(反码:将二进制数按位取反)。我们举个例子

    127-128,一般在计算机中都是使用加法的。

     127-128
    原码0111111110000000
    反码 11111111
    补码0111111110000000

    127     01111111

    -128    10000000

            11111111因为这个是补码,转为反码就是11111110,原码是10000001=-1

    为什么8位二进制的取值范围是-128~127,指的是补码的范围。

    一个有意思的发现

    里面的模-负数绝对值的原码=补码(可以看第一个参考地址)

    我对模的定义,每一位二进制都可以存2个数,也就是它的容量。对于一个字节8位二进制,它的模是2^{8}=256,也就是-128~+127里面中整数的个数。

    参考

    第一个比较经典

    https://blog.csdn.net/leonliu06/article/details/78685197

    https://zhidao.baidu.com/question/143216665.html

     

     

    展开全文
  • 8位二进制范围

    千次阅读 2020-04-15 21:22:59
    文章目录8位二进制数的范围原码、反码、补码区别计算机以补码形式存储 8位二进制数的范围 原码、反码、补码区别 原码:用符号位和数值标识带符号数,第一位表示符号位,正数的符号位用0,负数的符号位用1,数值部分...

    8位二进制数的范围

    原码、反码、补码区别

    • 原码:用符号位和数值标识带符号数,第一位表示符号位,正数的符号位用0,负数的符号位用1,数值部分用二进制形式标识
    • 反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外取反
    • 补码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外取反,然后在最后一位加1

    正零(0000 0000)和负零(1000 0000)的补码相同,都是0000 0000

    计算机以补码形式存储

    注意,我们常说的都是指补码

    真值原码反码补码补码表示的数值
    00000_00000000_00000
    10000_00010000_00011
    1270111_11110111_1111127
    -01000_00001111_11111_0000_0000-128
    -11000_00011111_11101111_1111-127
    -21000_00101111_11011111_1110-126
    -1271111_11111000_00001000_0001-1

    所以
    0000_0000 到 0111_1111 => 0到127
    1000_0001 到 1111_1111 => -1到-127
    上述的-0(1000_0000)特殊情况,规定它在计算机中的表示的数为-128

    n位二进制数值范围公式

    原码和反码:-2^(n-1)-1到 +2^(n-1)-1
    补码:-2^(n-1) 到+2^(n-1)-1

    展开全文
  • 0-255的二进制如上图 我们惊奇地发现,如果二进制是无符号的,那么我们如何表示负数呢? 我们总不能用+1表示正数,-1表示负数吧,计算机只认识0和1啊。。。于是有种想法应运而生, 最高位为符号位,用0表示正数,...

     

    0-255 的二进制如上图

    我们惊奇地发现,如果二进制是无符号的,那么我们如何表示负数呢?

    我们总不能用+1表示正数,-1表示负数吧,计算机只认识0和1啊。。。于是有种想法应运而生,

    最高位为符号位,用0表示正数,用1表示负数。比如:

    0,   0000 0000

    +1, 0000 0001

    +2, 0000 0010

    +3, 0000 0011

    +4, 0000 0100

    -1 1000 0001

    -2 1000 0010

    -3 1000 0011

    -4 1000 0100

    但是问题又来了,带有负数的运算非常麻烦,非常恶心,还有竟然出现了+0和-0,+0就是0000 0000

    -0就是1000 0000,-0这种东西对我们来说毫无意义,多了一个无意义的数非常恶心!

    我们突然想到了时钟,

     

    根据时钟的原理,或说模的原理。8位二进制数的模是2^8=256,就像是一个有256个小时的时钟

     

    因此这个时钟对应的所有正数和负数其实都有一个对应的数!!

    这个时钟对应的所有正数指的就是 0,1,2,3,4,.......255

    这个时钟对应的所有负数指的就是 -1,-2,-3,-4,......-256

    那么这些数是如何对应的呢?(见上图)

    也就是说顺时针旋转1小时等于逆时针旋转255小时,1对应-255

    逆时针旋转1小时等于顺时针旋转255小时,-1对应255。

     

    那么问题又来了,知道这个有什么卵用呢?用处就是对于这种像时钟一样成环的数,他的运算是有两种方式的,他既可以加也可以减,就好像你去操场跑圈,假设400米的圆形跑道,你逆时针跑100米和你顺时针跑300米都能到达同一个位置。那么我们讨厌的是负数,我们当然不能把正数替换成负数,应该把负数替换成正数,这样所有减法就变成了加法。

    像上图一样,上图出现的那些二进制数就可以表示-1到-128

     

    我们为了运算方便,用那些本来表示正数的二进制去表示负数,

    没错,这样做确实使得负数的运算变成了正数。

    但是问题又来了,

    问题一:我们之前用最高位为符号位解决了正数和负数的表示的问题,如果此时你把上图中那些本来表示正数的二进制去表示负数,那么负数岂不是有两种表示,一种是我们看得懂的表示,一种是便于运算的表示。那负数到底该怎么表示呢?

    问题二:你把上图中那些本来表示正数的二进制去表示负数,那么本来表示正数的那些二进制该何去何从呢?也就是说我现在要怎么表示128,129.....255??? 

     

    于是补码的概念应运而生,

    只要我们把带符号的表示,或说我们看得懂的表示,称为原码

    把便于运算的表示称为补码。

    这样一来,负数的原码是用来表示负数的,而负数的补码是用来参与运算的,“表示一个数”和“这个数参与运算”进行了分离,运算我们只要在补码中运算就行了,运算的结果是补码,我们只要将补码转为原码我们就看得懂了。

    如此一来,问题一是解决了。 看下图。圈起来的二进制数就是那些负数对应的补码,这样子也算明白了。

    为什么-1的原码刚好是-127的补码,-127的原码刚好是-1的补码。这个我觉得看下图就明白了,感觉只是一个纯属巧合,并且这不是重点。非要解释的话,应该是这种环形的数的特点。

    但是看下图也算明白了另一个事,就是为什么要把1000 0000 表示成-128的补码,因为1000 0000 在无符号的情况下表示的正好是128,而128在256这个环里,是对应-128的。但是很不幸,1000 0000 这个无符号数变成有符号的时候,他是表示-0,这与其他数不一样了,其他数在他们从无符号变成有符号的时候都能变成一个有实际意义的数。比如原先无符号的1000 0001(129)变成有符号的数是-1。

    而1000 0000 变成有符号的数却是-0这种没意义的数,我们之前通过时钟推算出1000 0000这个二进制数就是-128的补码,但是我们已经无法在8位二进制中找到一个长得像-128的二进制数来作为-128的原码了,所以我们只能强行规定-128的原码反码补码都是1000 0000,而且这样做也符合原码和补码转换时的取反加1规则。1000 0000符号位不变,取反加1还是1000 0000。

    它可能是长得最不像-128的原码了。

    然而 后人 不清楚这个由来的就开始懵逼了,为啥长的像-0的数却是-128的补码呀???为啥长得像-0的数却表示-128?前人不暇自哀,而后人哀之。后人哀之鉴之,后人复哀后人也。

    于是问题一就解决了。我们解决了以下问题:

    1.负数怎么表示=》用最高位符号位表示

    2.负数怎么运算比较简单 =》 引入补码,将负数的表示称为原码,负数用于运算的称为补码。表示和运算相分离。

    3.-0我们表示成-128的补码,解决了两个0而导致有一个-0是无意义的数的问题。

     

    但是问题二这么解决呢?其实吧。当我们引入有符号数的时候,问题二已经产生了,有一半的正数,也就是128-255被砍掉了,他们被用来表示负数,想想0-127是表示正数,原先128-255的二进制被用来表示负数,正好256一半表示正数,一半表示负数,这就是有符号数的特点,砍掉原来无符号数的一半正数来表示负数,而且最高位的数变成符号位。

    但是问题二不需要解决,被砍掉的正数用更多的位数去表示就ok了,但是8位有符号数就没办法表示的了。

    所以8位有符号的整数取值范围的补码表示:

    0-127 二进制为0000 0000 到 0111 1111

    -128到-1 二进制位 1000 0000 到 1111 1111

     

    上图有一部分之所以划掉是因为我们并不想将正数替换成负数去运算,所以那部分是没用的。

    而上图圈出来的部分是用于负数运算的,也就是负数的补码,我们从另一一个视角看看负数的补码,即下图的视角。

    两个视角下来看,似乎一切都明朗了,-1到-127原码和补码的二进制刚好顺序倒了过来。

     

    展开全文
  • 二进制码中负数如何表示? 整数的取值范围 整数数据类型包括:byte、short、int、long四种类型,以下分别为各类型取值范围: byte 的取值范围为-128~127(-27至27-1) ,占1个字节(8位); short 的取值范围为-...

    整数的取值范围

    整数数据类型包括:byte、short、int、long四种类型,以下分别为各类型取值范围:
    byte 的取值范围为-128~127(-27至27-1) ,占1个字节(8位);
    short 的取值范围为-32768~32767(-215至215-1),占用2个字节(16位);
    int 的取值范围为-2147483648~2147483647(-231至231-1) ,占用4个字节(32位);
    long 的取值范围为-9223372036854774808~9223372036854774807(-263至263-1),占用8个字节(64位)。

    二进制码中负数如何表示

    在二进制码中,为了区分正负数,采用最高位是符号位的方法来区分,正数的符号位为0、负数的符号位为1。剩下的就是这个数的绝对值部分(即去掉最高位的部分),可以采用原码、反码、补码3种形式来表示绝对值部分。

    原码度最简单,也最好理解。原码就是绝对值的二进制数形式:例如+7的8位二进制原码是0000111,-7的8位二进制原码是10000111。

    ps:了解到这里就可以计算各整数类型取值范围了,以byte类型为例,虽然byte类型有8位,但第一位为符号位而不是数值,所以其最大值为01111111(十进制即127),最小值为11111111(十进制即-128)

    对于二进制运算而言,原码的运算不够方便,当两个数相加时,先要判断这两个数的回符号是否相同,符号不同的话,还要判断哪一个数的绝对值更大。所以在计算机中,通常都是采用补码形式。

    正整数的补码与原码形式相同,例如+7的8位二进制补码是00000111;而负整数的补码则可以通过下列方式得到:将这个负整数的绝对值(对于8位二进制码,即后7位)求反(即0变1,1变0)后加1,连同符号位1一起表示就可以了。例如-7的8位二进制补码:将-7的绝对值7求反加1得1111001,连同符号位1一起就是11111001。下面详细阐述负数采用补码形式的好处。

    以下内容的原文链接,本文更改了一些细节。
    ————————————————

    二进制码采用补码形式的好处

    首先,要明确一点。计算机内部用什么方式表示负数,其实是无所谓的。只要能够保持一一对应的关系,就可以用任意方式表示负数。所以,既然可以任意选择,那么理应选择一种最方便的方式。

    2的补码(即二进制码采用补码形式)就是最方便的方式。它的便利体现在,所有的加法运算可以使用同一种电路完成。

    以-8作为例子。假定有两种表示方法。一种是原码表示法,即10001000;另一种是2的补码表示法,即11111000。请问哪一种表示法在加法运算中更方便?

    随便写一个计算式,16 + (-8) = ?

    16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:

    00010000
    +10001000
    ---------
     10011000

    可以看到,如果按照正常的加法规则,就会得到10011000的结果,转成十进制就是-24。显然,这是错误的答案。也就是说,在这种情况下,正常的加法规则不适用于正数与负数的加法,因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。从电路上说,就是必须为加法运算做两种电路。

    现在,再来看2的补码表示法。

    00010000
    +11111000
    ---------
    100001000

    可以看到,按照正常的加法规则,得到的结果是100001000。注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。这说明了,2的补码表示法可以将加法运算规则,扩展到整个整数集,从而用一套电路就可以实现全部整数的加法。

    2的补码的本质

    在回答2的补码为什么能正确实现加法运算之前,我们先看看它的本质,也就是那两个步骤的转换方法是怎么来的。

    要将正数转成对应的负数,其实只要用0减去这个数就可以了。比如,-8其实就是0-8。

    已知8的二进制是00001000,-8就可以用下面的式子求出:

    00000000
    -00001000
    ---------

    因为00000000(被减数)小于0000100(减数),所以不够减。请回忆一下小学算术,如果被减数的某一位小于减数,我们怎么办?很简单,问上一位借1就可以了。

    所以,0000000也问上一位借了1,也就是说,被减数其实是100000000,算式也就改写成:

    100000000
    -00001000
    ---------
     11111000

    进一步观察,可以发现100000000 = 11111111 + 1,所以上面的式子可以拆成两个:

    11111111
    -00001000
    ---------
     11110111
    +00000001
    ---------
     11111000

    2的补码的两个转换步骤就是这么来的。

    为什么正数加法适用于2的补码?

    实际上,我们要证明的是,X-Y或X+(-Y)可以用X加上Y的2的补码完成。

    Y的2的补码等于(11111111-Y)+1。所以,X加上Y的2的补码,就等于:

    X + (11111111-Y) + 1

    我们假定这个算式的结果等于Z,即 Z = X + (11111111-Y) + 1

    接下来,分成两种情况讨论。

    第一种情况,如果X小于Y,那么Z是一个负数。这时,我们就对Z采用2的补码的逆运算,求出它对应的正数绝对值,再在前面加上负号就行了。所以,

    Z = -[11111111-(Z-1)] = -[11111111-(X + (11111111-Y) + 1-1)] = X - Y

    第二种情况,如果X大于Y,这意味着Z肯定大于11111111,但是我们规定了这是8位机,最高的第9位是溢出位,必须被舍去,这相当于减去100000000。所以,

    Z = Z - 100000000 = X + (11111111-Y) + 1 - 100000000 = X - Y

    这就证明了,在正常的加法规则下,可以利用2的补码得到正数与负数相加的正确结果。换言之,计算机只要部署加法电路和补码电路,就可以完成所有整数的加法。
    ————————————————

    展开全文
  • 用8位二进制表示机器数[一个符号位] 原码表示的范围-127~+127 而用其补码表示则是-128 ~ +127 ----> 10000000~01111111,为什么10000000就是表示-128, 回答: 因为有一位是符号位,所以后7位是数值位。 2^7=128,...
  • 二进制补码范围简单总结

    千次阅读 2013-09-07 20:38:24
    8位补码范围是 -128至127. ...将每个二进制位(包括符号位)取反加1,得到一个二进制数,将该数看成无符号数,其值就是上述负数的绝对值。 例如,二进制的 10000000 的最高位为1, 所以它表示的是负数。是负
  • 二进制的码问题

    2019-09-29 05:44:30
    要了解计算机的运算方式,那么二进制的码问题自然就很必须,所以我在这里和大家分享一下二进制中原码、反码、...第一位是符号位,其余位为数值位,所以得到8位二进制取值范围是 [1111 1111 , 01111 1111] 即 [-1...
  • 当时只想记住范围,没有想过存储原理,只知道书上记载因为一个字节中,第一个二进制数为符号位(0为正号,1为负号),因此byte的数据范围最大值为2^7 - 1 = 127 仔细想想,虽然明白正数被占...
  • java中用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数。正数补码为其本身;负数补码为其绝对值各位取反加1; 例如: +21,其二进制表示形式是0001 0101,则其补码...
  • int8取值范围是-128 - 127 unsigned int8 0-255 Int16 意思是16位整数(16bit integer),相当于short 占2个字节 -32768 ~ 32767 Int32 意思是32位整数(32bit integer), 相当于 int 占4个字节 -2147483648 ~ ...
  • 本文原文来自 《二进制的认识和Java中对二进制的使用》。 本文的讲解及代码部分都是针对Java语言,可能对其它语言并不适用,但介于这部分内容较底层,因此可酌情参考。 一、认识二进制 二进制,是计算技术中广泛采用...
  • 二进制的表示范围

    千次阅读 2019-10-02 13:01:07
    引用 http://106.13.124.230/index.php/2019/10/02/z3/
  • JavaScript-二进制二进制数组

    万次阅读 2016-07-03 18:09:40
    在ES5中引入了Blob用于处理二进制。在ES6中引入了ArrayBuffer、TypedArray、DataView用于处理二进制数组。常规的前端操作用,用到二进制的地方不多。但是,当我想处理文件的传输时候,使用二进制进行传输可以更快。...
  • int的取值范围

    万次阅读 多人点赞 2019-08-05 21:19:38
    在学C++或者Java的时候应该都会先了解各种基本数据类型的初值和它们的取值范围,有些人可能会不太重视这块内容,其实很重要,很多大公司面试的过程中都会问到int的取值范围,溢出之后会怎么样等问题。 正文 首先来...
  • 在昨天的文章中我们讲解了什么原码反码补码,以及计算机中为什么要使用补码,在文章最后的时候我们说了一个问题,八位二进制(在Java中就是byte类型)的取值范围是从-128到127,为什么呢? 为什么127+1的结果是-128...
  • 源码 原码就是符号位加上真值的绝对值, 即用第一位表示... 因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 1111 , 0111 1111] 即 [-127 , 127] 反码 正数的反码是其本身 负数的反码
  • 关于数值的取值范围以及原理 1.二进制 计算机规定0000 0000代表0,1000 0000代表-0没有意义,如byte占用1字节,二进制八位为一字节,且每位用1或0表示,能够表示256(2^8)个数据。 八位为符号位(最高位)...
  • 一、计算机中的二进制位运算??二进制的位运算并不是很难掌握,因为位运算总共只有5种运算:与、或、异或、左移、右移。与、或和异或运算的规律我们可以用表1总结如下。表1 与、或、异或的运算规律与(&)0 & 0...
  • 在解决该题之前,我们先来了解一下十进制转换成二进制的方法将十进制转换成二进制的方法方法一:利用Interger.toBinaryString()的方法。方法二:除基倒取余法 输入一个十进制数n,每次用n除以2,把余数记下来,再用...
  • 简单的二进制

    2016-07-07 21:29:12
    基本常识点 莱布尼茨“逢二进一”、“ 借一当二”机器语言开关高低位 进制转换 正整数转二进制小数转二进制负整数转二进制二进制 八进制二进制 十六进制
  • 计算机二进制编码

    2020-10-17 17:00:56
    二进制编码知识。
  • 十进制数转换为二进制数、八进制数、十六进制数的方法: 二进制数、八进制数、十六进制数转换为十进制数的方法:按权展开求和 与十进制 (1)二进制转十进制 方法:“按权展开求和” 【例】: 规律:...
  • 计算机二进制

    千次阅读 2019-02-25 11:25:26
    计算机二进制背景1背景2 背景1 计算机底层是二进制数进行计算和存储,因此底层只有0和1 计算机底层在计算的时候,只做一件事:相加,并且是二进制数的相加,也就是满0进1 背景2 二进制:由0和1构成的数 如:3的...
  • java二进制相关基础

    2017-12-05 12:12:02
    之前在JVM菜鸟进阶高手之路十(基础知识开场白)的时候简单提到了二进制相关问题,最近在看RocketMQ的源码的时候,发现涉及二进制的内容蛮多,jdk源码里面也是有很多涉及到二进制相关的操作,今天这篇文章仅仅是...
  • matlab中只能够实现十进制整数转换为二进制,对于小数部分会直接忽略,这对于精确度很高的数据来说,非常不合理。下面是自己编写的实现十进制小数的二进制编码的matlab代码。 基本原理: 整数部分:除二取整,逆序...
  • 十进制转二进制 概念 原码: 一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。 正数与负数二进制表示的区别就在于最高位,最高位1表示负数,最高位0...
  • MySql 二进制类型

    千次阅读 2015-10-25 15:04:58
    MySQL二进制类型 二进制类型是在数据库中存储二进制数据的数据类型。二进制类型包括BINARY、VARBINARY、BIT、...取值范围 BINARY(M) 字节数为M字节,允许长度为0~M的固定长度二进制字符串 VARB
  • 有符号整数 n位二进制的表示范围

    千次阅读 2012-03-18 23:05:00
    最终的n位二进制表示的十进制范围就是-2(n-1)<=X<=2(n-1)-1 机器的减运算其实就是固定位数的两个二进制相加溢出的结果 转载于:https://www.cnblogs.com/fy1990/archive/2012/03/18/2405233.html...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 88,394
精华内容 35,357
关键字:

二进制取值范围