首页 > 试题广场 >

以下 b 的值是: byte b = (byte)129;

[单选题]

以下 b 的值是: byte b = (byte)129;

  • -126
  • -127
  • -128
  • -129
推荐

答案是B。
因为byte是有符号单字节整形,所以存储数字范围是[-128·127]
而127[01111111]+1==128[10000000]。
为什么呢?
因为科学家定义数字的时候是一个环,最大的数字后面就是最小,这样才可以把[0·255]分配给[-128·127]。
底层就是补码的概念。
好,我们再从java程序上运行一次。

public class HelloWorld {
    public static void main(String []args) {
       byte b = (byte)129;
       byte c = (byte)128;
       System.out.println(b);
       System.out.println(c);
    }
}
编辑于 2019-04-25 14:20:41 回复(14)
都写的啥****,我来正解,上面没看到完全正确的,所以实在忍不了写出正确的解答
这题考察的就两个知识点:一、强制转换(主要涉及各个类型占几个字节,这里我只简单说一下byte型占一个字节,也就是8位,int型4个字节,32位);二、在计算机系统中,数值一律用补码来表示(存储)
正数:补码=反码=原码(当然以二进制形式表达)
129 int类型(4个字节)二进制: 00000000 00000000 00000000 10000001
强制转换byte型后,只有一个字节即 10000001(注意这里从二进制角度看,第一位是符号位,即求负数的补码接下来)
只要求出上面原码对应的补码就行了,然后再转换对应的int型数值(因为题干所给的答案都是比较int型)
10000001(原码) 对应的反码为1111 1110
又补码等于反码+1
即1111 1111  该二进制转换int型刚好是-127(1+2+4+8+16+32+64)

普及一下:正数原码,反码,补码相同
负数反码除了符号位不变,其他位取反,补码=反码+1;

之前那些解答都啥玩意,不会别误导大家,我的是正解,嘻嘻
编辑于 2019-06-11 21:47:30 回复(78)
选B。考察的是数据类型转换。
129 int类型(4个字节)二进制: 00000000 00000000 00000000 10000001
在计算机系统中,数值一律用补码来表示(存储),正数的补码和源码相同
  1. int -> byte(1个字节),截取: 10000001
  2. 补码转反码:1开始则为负数,负数得到反码是末位-1: 10000000
  3. 负数的反码转原码(最高位即符号位不变):11111111
  4. 转换为十进制:-(27-1)=-127

编辑于 2019-04-24 16:36:04 回复(15)
其实可以把每个数据类型范围画成一个圈,byte是从-128-127,可以这样想,从-128开始,向上加就是一步一步画圈,知道加到127,这个圆圈刚好补满了,所以127再加一就又到了-128,再加一就是129,也就是-127
发表于 2019-07-28 10:31:54 回复(2)
选 B。。
首先我们要知道计算机中的数值一律是用补码来表示和存储的。 
其次在java中整数默认为int。 
最后知道 补码= 反码+1 
那么回到题中,int 129的补码,原码相同且为
0000 0000 0000 0000 0000 0000 1000 0001
共4个字节32位,将它赋值给只有一个字节的byte b时会发生溢出截断,只会将低8位赋值给b.

因此此时b为 1000 0001(此处为补码,不是原码!!!!再次强调是补码!) 
b得到的数是补码,且是b的补码得于 1000 0001。 
给大家一个代码,验证。。

由于b此时的补码是1000 0001
 因此最高位是符号位不动 
 反码:1000 0000 ( 补码-1=反码) 
 原码:1111 1111 (原码= 反码取反) 
原码就是真值,也就是b真正的值,最高的1为符号位(负),剩下的111 1111为127 
故b = -127。。。。
这才是正解。。
理是这样的。但真要这么算就太费时了。肯定得偷下懒。
首先我们知道int转byte时是截取低八位,只要知道低八位的值,也就知道了截取后的补码,及所代表的真值。因此要知道截取了个什么东西?
其次得知道对于有符号的byte转int是低位不变,符号位扩展(及原本位数不动,高位填充符号的值,short同理)。这样也就说明了当int数值处于[-128,127]时,低八位与byte补码值是一模一样的,而且还代表着同一个真值。
综上所述,只要int低八位不动,高位不管怎么变,截取值byte都不会变,所以只要我们只要将int的高位置零,留下低八位(也就是人为让int值处于[-128,127]),而此时由于数据转换的特性,int的所代表真值正好就是截断后的byte的真值。
那么如何让int高位变0,留下低八位,很简单,只要加减整数倍的九位数,也就是n*256(256二进制为1 0000 0000),这样低八位就不会变,而高位会变0。
所以129-256 =-127.搞定收工。

编辑于 2021-07-21 18:08:00 回复(11)

选B
看到byte关键字应当知道这是一道Java试题。首先回顾一下,在Java中,byte类型的变量是八位带符号(注意这点)的二进制整数,它的可表示范围为[-128, 127]。题中这条语句的功能是声明一个byte类型的变量b,并将其初始化

显然,整数129并不在它的可表示范围中,但注意数字前面有一个(byte),其作用是强制类型转换,表示将整数129强制转换为byte类型的数据。

学过计算机组成原理后,我们知道在计算机中各种各样的数据都是用0和1组成的二进制序列表示的,对同一二进制序列,用不同的表示方法(原码、反码、补码等),它的值可能不同。计算机内存中通常是以补码作为数据的表示方式。数129的补码表示为1000 00001,当它被显式强制类型转换成byte后,变量b的表示值应为-127(byte类型是有符号的,故二进制的最高位1表示这是一个负数,除去符号位其余各位按位取反再加1的值为其绝对值127,两者组合在一起即为-127)。

可通过以下代码验证:

public class Test {
    public static void main() {
        byte b = (byte)129;
        System.out.println(b);
    }
}

故答案选B

编辑于 2019-04-24 16:04:40 回复(0)
科学家定义数字的时候是一个环,最大的数字后面就是最小。 这句话足够了吧,byte取值范围是-128到127,129是127后面的第二个数,所以是-127。
发表于 2019-08-15 22:59:05 回复(0)
可以把他想象成一个区间为 [-128]~0~[127]圆形转盘 超过了127就到了-128再过去一个就是-127了
发表于 2022-02-15 00:19:40 回复(0)
B
1000 0001 这是 129的二进制表示
在byte中他表示-127
这里的第一位1表示-128加上1表示-127
编辑于 2017-02-05 15:40:01 回复(1)
130举例
发表于 2019-09-09 20:19:06 回复(0)
byte 1字节 8bit 也就是8位 范围在- 2^(8-1) ~ 2^(8-1) - 1 也就是(-128~127)
byte b = byte(129), 超过范围,会溢出,127 + 1 就是 -128, 127 + 2 也就是-127
发表于 2022-03-31 19:15:44 回复(0)
129默认为int型,其底层是2进制为00000000 00000000 00000000 1000 0001。强制转换成byte类型时 直接截取后面8位为1000 0001。 需要注意的是,第一位是符号位,计算机中数字都是用补码表示的。即现在得到的补码是1000 0001,根据这个补码求原码,原码就是真值。负数的补码等于反码+1,反码等于原码的符号位之外的其他位全部取反。则补码减1即得到反码1000 0000,反码后七位取反得到原码为1111 1111 换成十进制为-127 即真值为-127。选B
发表于 2022-02-09 13:58:00 回复(0)
知识点:
    1.计算机中,数据都是以补码形式展示
    2.正数,原码=反码=补码;负数:原码 = 反码取反,补码=反码+1;

129的二级制补码:1000 0001,那么原码也是1000 0001
129强转byte,截取8位,第一位表示符号。
那么(byte)129原码:1000 0001,反码:1111 1110,补码:1111 1111 = -127

发表于 2019-09-03 17:32:52 回复(1)
如果不想计算的话
做了几道这样的题我总结了一个规律
强转的时候这个数比128大多少,那么输出的结果就比-128大多少
比如本题中129比128大1,那么输出的结果就是比-128大1的数,也就是-127
自己做题的时候总结的规律,有什么不妥的地方还请大家指正
发表于 2019-08-22 19:31:18 回复(0)
谢谢kome,我破解了!

byte是有符号,有正负,有符号位,符号位,算反码补码不改变。计算机系统中数值一律用补码存储,补码等于反码加一。正数的补码 反码 原码相同。byte型129原码1000 0001,因为是有符号位,反码是111 1110,补码等于反码加一:111 1111 加上一个符号位1111 1111,为-127.正数符号位为0,负数符号位为1.
编辑于 2022-01-06 10:48:11 回复(0)
129 = 1000 0001
范围:-127,128
转反码: 1111 1110
转补码: 1111 1111=-127
发表于 2021-05-13 13:19:57 回复(0)
<p>一个字节129存不下的,底层是有符号的二进制数来存储的,它是一个环,所以129前面应该是-128,-128前面是,-127。所以答案就是-127</p>
发表于 2020-10-26 11:15:12 回复(0)
补码题搞清楚
发表于 2020-05-23 16:22:40 回复(0)
关于一个环什么的,数据溢出确实是有这个规律,也可以从补码表示上来解释
计算机中的数据,可以通过补码的表示形式直接计算,符号位也参与运算,规则为符号位的运算结果加个符号,其余的不变(注:只适用于补码形式)
对于8位的二进制数据,最大正数为+127,补码为01111111,再加1后,就变成了10000000,即-(2^7)+0,就是所谓的-128,-128减去1变为+127也是同样的道理
对于一般的数据也同样适用。例如+3和-3,+3没啥说的,重点说一下-3
为了方便计算,用4位2进制数表示,则对于-3来说,
原码:1011
反码:1100
补码:1101
如果从原码上计算具体值,只计算除了符号位剩下的,即1*2^0+1*2^1+0*2^2=3,符号位为1,则是-3
如果从补码上计算具体值,全部二进制位数都参与运算,同时符号位的结果加个符号,即1*2^0+0*2^1+1*2^2-1*2^3=1+0+4-8=-3


回到本题,一系列操作之后,变成了10000001,则直接根据-1*2^7+1*2^0=-127,也可以得出结果
关于补码于具体数据之间的关系,我还不太确定是不是这个关系,好像在一本书上看过,记不清了

发表于 2019-12-28 15:27:42 回复(0)
一个比较简单的理解方式是byte范围为-128-127,超出范围的就会从底部再来,129=127+2,则可以理解为127+1=-128,-128+1=-127
发表于 2019-12-04 05:51:50 回复(0)
128->1000 0000
129 = 128+1 -> 1000 0001
在计算机中整数用补码表示,带符号的类型最高位为符号位,1代表负数,所以129转为byte类型,转为源码(除符号位取反+1)为:1111 1111->-127,结果为-127.
发表于 2019-08-12 11:14:23 回复(0)