首页 > 试题广场 > 以下 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 回复(4)
都写的啥几把玩意,我来正解,上面没看到完全正确的,所以实在忍不了写出正确的解答
这题考察的就两个知识点:一、强制转换(主要涉及各个类型占几个字节,这里我只简单说一下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 回复(10)
选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 回复(1)
BD头像 BD
选B
正向溢出:最小值+余数-1
负向溢出:最大值-余数+1
byte存储范围[-128, 127]
129大于最大值则为正向溢出,结果为 -128 + (129%127) -1 = -127
若为 -129, 则为负向溢出,结果应为 127 - (-129%-128) + 1 = 127
发表于 2019-06-04 11:42:06 回复(1)
其实可以把每个数据类型范围画成一个圈,byte是从-128-127,可以这样想,从-128开始,向上加就是一步一步画圈,知道加到127,这个圆圈刚好补满了,所以127再加一就又到了-128,再加一就是129,也就是-127
发表于 2019-07-28 10:31:54 回复(0)

选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->1000 0000
129 = 128+1 -> 1000 0001
在计算机中整数用补码表示,带符号的类型最高位为符号位,1代表负数,所以129转为byte类型,转为源码(除符号位取反+1)为:1111 1111->-127,结果为-127.
发表于 2019-08-12 11:14:23 回复(0)
如果不想计算的话
做了几道这样的题我总结了一个规律
强转的时候这个数比128大多少,那么输出的结果就比-128大多少
比如本题中129比128大1,那么输出的结果就是比-128大1的数,也就是-127
自己做题的时候总结的规律,有什么不妥的地方还请大家指正
发表于 2019-08-22 19:31:18 回复(0)
B
1000 0001 这是 129的二进制表示
在byte中他表示-127
这里的第一位1表示-128加上1表示-127
编辑于 2017-02-05 15:40:01 回复(1)