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