精华内容
下载资源
问答
  • 我的疑惑 一个字节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
    原码 01111111 10000000
    反码   11111111
    补码 01111111 10000000

    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

     

     

    展开全文
  • 回归正题,如何计算二进制数的取值范围呢?比如,Java中的 int 数据类型是32位,那么 int 所能表现的范围是多少呢? 设想有 8 条电路,每条电路有低电平和高电平两种状态。根据数学排列组合,有 8 个 2 相乘,即 2^...

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

    简单的说,计算机就是晶体管、电路板组装起来对的电子设备,无论是图形图像的渲染、网络远程共享,还是大数据计算,归根结底都是 0 与 1 的信号处理。信息存储和逻辑计算的元数据,只能是 0 与 1,但是它们在不同介质里的物理表现方式却是不一样的,如三极管的断电与通电、CPU的低电平与高电平、磁盘的电荷左右方向。明确了0与1的物理表现方式后,设定基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,所以称为二进制。

    回归正题,如何计算二进制数的取值范围呢?比如,Java中的 int 数据类型是32位,那么 int 所能表现的范围是多少呢?

    设想有 8 条电路,每条电路有低电平和高电平两种状态。根据数学排列组合,有 8 个 2 相乘,即 2^8,能够表示 256 种不同的信号。假设表示区间为 0~255,最大数即为 2^8 -1 = 256 -1 = 255,减去 1 的原因是因为第一个数用来表示 0,所以可表示的总数减 1 就等于最大数,那么 32 条电路能够表示的最大数为 (2^32-1)= 4,294,967,295。平时所说的 32 位机器,就能够同时处理字长为 32 位的电路信号。

    如何表示负数呢?上面的 8 条电路,最左侧的一条表示正负,0 表示正数,1 表示负数,该位为符号位,不参与数值运算表示。8 条电路,实际的数值部分只有 7 位,那么最大值用二进制表示即为 0111 1111 即 127。

    你也可以换种思维去理解,数值部分有 7 位,根据数学排列组合,有 7 个 2 相乘,即 2^7 ,能够表示 128 种信号。加上第一位符号位的 0 或 1,能够表示 128 x 2 = 256 种信号。包括正数 128 个、负数 128 个,范围即 0 ~ 127、-128 ~ -1,表示范围因有正负之分而改变为 -128 ~127。

    二进制整数最终都是以补码形式出现的。正数的补码与原码、反码是一样的,而负数的补码是反码加 1 的结果。这样使减法运算可以使用加法器实现,符号位也参与运算。需要注意的是,负数的原码、反码、补码的符号位始终是 1,只有数值部分参与原码到反码、原码到补码的转换运算。

    回到原来的问题,Java中的 int 数据类型是 32 位,那么 int 所能表现的范围是多少呢?

    数值部分所能表示的范围个数是 2^31,算上符号位的 0 或 1,即正数范围 0 ~ 2^31-1,负数范围为 -2^31 ~ -1,合计为 -2^31 ~ 2^31-1。


    参考资料

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

    《码出高效:Java开发手册》

    版权声明

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

    展开全文
  • 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原码和补码的二进制刚好顺序倒了过来。

     

    展开全文
  • 例如:+21,其二进制表示形式是0001 0101,则其补码同样为0001 0101-21,按照概念其绝对值为0001 0101,各位取反为1110 1010,再加1为1110 1011,即-21的二进制表示形式为1110 1011byte范围推导步...

    java中用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数。

    正数补码为其本身;

    负数补码为其绝对值各位取反加1;

    例如:

    +21,其二进制表示形式是0001 0101,则其补码同样为0001 0101

    -21,按照概念其绝对值为0001 0101,各位取反为1110 1010,再加1为1110 1011,即-21的二进制表示形式为1110 1011

    byte范围推导步骤:

    【思考】正向思路为,算出数值的源码——>数值的补码;而java数值存储一补码存储,那么我们就要以数值的补码——>数值的源码——>算出数值。

    1、byte为一字节8位,最高位是符号位,即最大值是0111  1111(补码),因正数的补码是其本身,即此正数源码为0111  1111(源码),十进制表示形式为127,

    2、最大正数是0111 1111,那么最大的负数是1111 1111(补码),源码为补码减1为1111 1110 然后取反为0000  0001即源码数值为 1,加上补码最高位的符号表示,即为 -1.

    3、1000  0000是最小负数的补码表示形式,我们把补码计算步骤倒过来就即可。1000 0000减1得0111 1111然后取反1000  0000,因为负数的补码是其绝对值取反,即1000  0000为最小负数的绝对值,而1000  0000的十进制表示是128,所以最小负数是-128.

    4、由此可以得出byte的取值范围是-128到+127

    本文参考http://bbs.itheima.com/thread-136511-1-1.html

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

    2019-09-29 05:44:30
    要了解计算机的运算方式,那么二进制的码问题自然就很必须,所以我在这里和大家分享一下二进制中原码、反码、...第一位是符号位,其余位为数值位,所以得到8位二进制取值范围是 [1111 1111 , 01111 1111] 即 [-1...
  • 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 ~ ...
  • 当时只想记住范围,没有想过存储原理,只知道书上记载因为一个字节中,第一个二进制数为符号位(0为正号,1为负号),因此byte的数据范围最大值为2^7 - 1 = 127 仔细想想,虽然明白正数被占...
  • MySQL二进制类型二进制...MySQL的二进制类型如下表所示:整数类型取值范围BINARY(M)字节数为M字节,允许长度为0~M的固定长度二进制字符串VARBINARY(M)允许长度为0~M字节的可变长度二进制字符串,字节数为值的长度...
  • //整数转二进制 String str=Integer.toBinaryString(123); //整数转八进制 String str=Integer.toOctalString(123); //整数转十六进制 String str=Integer.toHexString(123); 3、查看数字的取值范围 //以Byte为...
  • 8位二进制能表达的范围是0~255,所以点分十进制的每一个数字的取值都在0~255之间。有的时候,比如为了换算子网掩码,我们需要将IP地址还原成二进制串的形式,如:11000000101010000000110000100001。今天小编看到一...
  • 源码 原码就是符号位加上真值的绝对值, 即用第一位表示... 因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 1111 , 0111 1111] 即 [-127 , 127] 反码 正数的反码是其本身 负数的反码
  • java中的int是无符号的(c语言还区分int整形和unsigned int无符号整型),取值范围 -231~231-1。二进制数在内存中以补码的形式存储的正数:补码就是转化为二进制负数:补码符号位是1,其它位是对应正数的二进制的取反...
  • 在昨天的文章中我们讲解了什么原码反码补码,以及计算机中为什么要使用补码,在文章最后的时候我们说了一个问题,八位二进制(在Java中就是byte类型)的取值范围是从-128到127,为什么呢? 为什么127+1的结果是-128...
  • PAGE PAGE #/ 4 实验课题一将一个十进制数... n输入待转换的数 str :输出转换好的P进制字符串 P输入要转换的进制取值可从 2到16如果在这范围之外可认为输 入错不做转换 将一个整数转换成P进制的数我们可以采用如下的
  • n输入待转换的数 str输出转换好的P进制字符串 P输入要转换的进制取值可从2到16如果在这范围之外可认为输入错不做转换 将一个整数转换成P进制的数我们可以采用如下的方法 例十进制转换成八进制P等于8(66)10=
  • 3.2.5 二进制数据类型MySQL支持的二进制数据类型主要有:BIT(M)、BINARY(M)、VARBINARY(M)、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB等7种,它们主要用来存储由“0”、“1”组成的字符串,跟字符串类型数据一样,...
  • MySql 二进制类型

    千次阅读 2015-10-25 15:04:58
    MySQL二进制类型 二进制类型是在数据库中存储二进制数据的数据类型。二进制类型包括BINARY、VARBINARY、BIT、...取值范围 BINARY(M) 字节数为M字节,允许长度为0~M的固定长度二进制字符串 VARB
  • 0x7fffffff = 一共8个数, 一个 f 是 4个 二进制位 , 两个 f 才占用一个字节。 所以,int占32位的时候,最大可以赋值为:2147483647。也就是0x7fffffff。 32/8 =4字节 0x7fffffff ...
  • 一、各数据类型的最大值和最小值整数:以byte为例,我们知道,byte...依照上面的推理方式可知总结下表:数据类型bit位取值范围byte8-2^7~2^7-1short16-2^15~2^15-1int32-2^32~2^32-1long64-2^63~2^63-1小数:我们知...
  • 首先我们需要理解有符号和无符号变量的区别,以1个字节十进制为例,有符号的取值范围为-127~+127,无符号取值范围为0-255;那么同一组二进制数据在转成有符号和无符号变量时有什么关联呢? 通常我们将二进制数据...
  • 负数的补码=该数绝对值的二进制数—取反—加1; 一个有符号的int型变量(当时2个字节时)取值范围:-2∧15~(2∧15-1),既-32768~32767;无符号的int型变量的取值范围是0~65535; 若int a=32767;int b=a+1;则...
  • 二进制数据类型

    2014-04-16 16:57:16
    二进制数据包括 Binary、Varbinary 和 Image   Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。   Binary[(n)] 是 n 位固定的二进制数据。其中,n 的取值范围是从 1 到 8000。其...
  • 1. 原码, 反码, 补码的基础概念和计算方法. 源码 原码就是符号位加上真值的绝对值, ... 因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 1111 , 0111 1111]==>[-127 , 127] 反码 反码的表示方法是
  • 遗传算法的二进制编码

    千次阅读 2020-06-01 20:08:34
    假设我们要用遗传算法求解某个函数的最大值,x的取值范围是[-3.0,12.1],那么我们现在就是要从这个取值范围内取出一些x来作为种群的个体,要取出多少个x这取决于你想要种群有多少个体,即种群规模。 如果我们用十...
  • 二进制加减运算

    2020-05-30 16:24:51
    因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 1111 , 0111 1111] 也就是[-127,127]; 第一位是1代表负数,第一位0代表正数 原码,反码,补码的关系 正数:原码=反码=补码 例如: 5,原码:...
  • 1.N位二进制数的取值范围 N位无符号型(unsigned)取值范围:2^N - 1 ~ 0;(可以表示2^N个数) N位有符号型(signed)取值范围:-2^(N-1)~ 2^(N-1) - 1;(可以表示2^N个数) 举例:N=10...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,336
精华内容 534
关键字:

二进制取值范围