首页 > 试题广场 >

经过强制类型转换以后,变量a,b的值分别为多少? short

[单选题]
经过强制类型转换以后,变量a,b的值分别为多少?
short a =128;
byte b =(byte) a;
  • 128  127
  • 128 -128
  • 128  128
  • 编译错误
推荐
B
1.short类型,a的二进制是:0000 0000 1000 0000;
2.强制转换的截后8位,正数用源码表示,负数用补码表示,第一位是符号。
3.因此,a截取后8位的二进制是:1000 0000,第一位是1,表示是一个负数,二进制的值是128,所以结果是   -128。
  不知道是否说清楚了,
编辑于 2015-12-08 18:42:11 回复(25)
-------------------------------------------------------------------------------
int占4个字节,32位
byte占1个字节,8位
所以强转时会截断。前24位
---------------------------------------------------------------------------
在内存中表示形式( 注意java中是以补码表示一个数,所以表示形式是补码,不是原码! ):
int a = 3         00000000  00000000  00000000 00000011 (强转byte时前面24个0被截断)
byte b = 3      00000011
int a = -3       11111111  11111111   11111111   11111101 (强转byte时前面24个1被截断)
byte b = -3     11111101
----------------------------------------------------------------------------
1、Java中用补码形式表示
2、第一位正负位,1表示负,0表示正。
3、原码:一个数的二进制表示。
                 3的原码00000011   -3的 原码 10000011
4、反码:负数原码按位取反(符号位不变)。正数原码本身。
                3的反码00000011   -3的反码11111100
5、补码:正数是原码本身。负数反码加1。
                 3的补码是00000011  -3的补码是11111101
-------------------------------------------------------------------------------
已知负数的补码,求负数:
补码-1=反码,反码按位取反=该负数绝对值
已知负数,求负数的补码:
1、负数原码除了符号位,按位取反(不含符号位),加1。
2、负数绝对值的补码(也就是原码),按位取反(含符号位),加1
java int 128转为byte,值:
128为正数,补码为10000000(前面24个0省略),变成byte,只剩下10000000(byte为1个字节),因为开头是1,所以为负数。即1个负数的补码是10000000。反码是01111111,原码是1000000。是128.因为是负数,所以是-128。
-------------------------------------------------------------------------------
发表于 2016-04-08 18:33:54 回复(19)
首先 java中 是以补码表示一个数,short 占两个字节 ,128 换成二进制的形式 是 00000000 10000000,byte 占用一个字节,short 强转为byte前面八位 截掉,变成 10000000,这是补码,先转换成反码,反码 = 补码 - 1,所以反码是 01111111,再求源码 10000000,因为是负数,所以等于-128.
发表于 2017-01-09 13:47:07 回复(1)
答案B,最终答案解析
short类型的a=128的二进制表示为00000000 10000000
short类型的a强制转换为byte类型的b时,截掉高八位,保留后八位,即1000 0000

以上各位答主都说清楚了,重点是1000 0000 为什么等于-128的问题,答主都是模棱两可,这里给出最终答案。顺便说一下真值,原码,反码,补码的定义和关系,具体见计算机组成原理。
1.真值就是指这里的128和-128这些带正负符号的数字。
2.目前计算机中的有符号数(包括有符号整数和有符号纯小数)都是用补码表示的(不区分正负),正数的原码=反码=补码,负数的反码=原码符号位不变,其它位取反(0变1,1变0),负数的补码=反码符号位不变,末尾+1(或者从后往前直到第一个为1的位不变,其它位取反)。需要注意:即使如此,原码与补码并不是一一对应的,表示着某真值(其实就是-128)的补码不是都能找到对应的原码
3.原码和补码表示范围是不同的,这也是1000 0000具体值是多少的重点,原码有正负0之分,即1000 0000的真值是-0,补码比原码多表示一位数,即1000 0000的真值是-128

那1000 0000是怎么计算出-128的,可以这样考虑,把第一位即当成符号位也当成最高位,这样对应成原码依然是1000 0000 但是与-0的意义不同,真值就是-128.

深入理解需要学习计算机组成原理搞清楚真值,原码,反码,补码的关系,这个问题就简单了。
发表于 2019-01-23 14:44:48 回复(0)
说实话,没有一个答案能让我完全看明白的
发表于 2019-04-03 10:46:02 回复(1)
(1)、int类型是4个字节,32位的,而short int类型是2个字节,16位的,
(2)、128的16位二进制表示 0000 0000 1000 0000,所以计算机输出short值是128没问题。
(3)、然后是后面强制类型转换,我之前只是大概的知道强制类型转换会丢失精度,但是是怎么截取,怎么转换的并没有真正理解,所以这题做错了。
(4)、原来,截取是从低位开始往高位截取,截取到转换后的类型(这里是byte)的长度停止,byte是8位,所以截取后的长度是8位,从低位截取,也就是1000 0000,好了,1000 0000翻译成10进制可不就是-0或者-128嘛。
发表于 2016-03-08 16:54:37 回复(2)
B  强制转换的截后8位,正数用源码表示,负数用补码表示,第一位是符号。
编辑于 2015-12-08 18:41:32 回复(1)
1.short类型,a的二进制是:0000 0000 1000 0000;
2.强制转换的截后8位,正数用源码表示,负数用补码表示,第一位是符号。
3.因此,a截取后8位的二进制是:1000 0000,第一位是1,表示是一个负数,第一位为1表示是负数 即000 0000 是补码,要求出原码 而补码的补码即原码 000 0000取反加1后得1000 0000 即128,二进制的值是128,所以结果是   -128。
  不知道是否说清楚了,
发表于 2017-04-20 14:22:25 回复(1)
看了真么多答案 真感觉每一个说到痛点的
发表于 2019-03-18 13:03:27 回复(0)
Byte范围【-128~127】,当强制转换128时,从头开始,结果为-128,129则为-127.。
发表于 2018-10-06 10:59:07 回复(0)
计算机java语言中,分配存储都是4个字节,byte截取1个字节,也就是低8位。128:0000 0000 1000 0000 short截取两个字节,+128
byte截取一个字节 1000 0000 第一位是符号位。然后加上1000 0000的绝对值。-128就这么出来了
发表于 2016-01-28 11:53:05 回复(2)
short类型,a的二进制是:0000 0000 1000 0000;
截取 后8位的二进制是:1000 0000
第一位是1,表示是一个负数。
在这里注意了:是有个约定的 
源码的表示范围是 -(2^7 - 1)到 2^7 - 1
补码的表示范围是 -2^7 到 2^7 - 1
补码要多出一个数,而这个数就是你10000000

在源码里面00000000和100000000都是表示0
这样比较浪费,在补码里面,就把100000000当做
-2^7 ,以扩大补码表示范围

如果没有这个约定 
1000 0000 (补码)->0111 1111(反码)->0000 0000(源码)
应该是表示0的。
发表于 2017-02-28 13:56:54 回复(0)
a是128是因为a没有变么?我看大家都在说b的问题。。这个问题求解答一下。
发表于 2019-05-17 14:53:53 回复(1)

我想结合高票答案的解释,再补充一下下~

二进制表示:

int a = 128 00000000 00000000 10000000 00000000

short a = 128 00000000 10000000 (强转后前面 16 位被截断)

可以看出来,a 的值输出应该还是 128

那么对于 byte b = (byte) a;

二进制表示:

short a = 128 00000000 10000000

byte b = 128 10000000 (强转后前面 8 位被截断)

但是,输出的 b 的值为什么不是 128 而是 -128 呢

Primitive Data Types (The Java™ Tutorials > Learning the Java Language > Language Basics)

byte: The byte data type is an 8-bit signed two's complement integer. It has a minimum value of -128 and a maximum value of 127 (inclusive). The byte data type can be useful for saving memory in large arrays, where the memory savings actually matters. They can also be used in place of int where their limits help to clarify your code; the fact that a variable's range is limited can serve as a form of documentation.

这是因为 byte 是一个 8 位有符号二进制补码整数,它包含的值的范围是 [-128, 127],因此 byte 类型的值是无法表示 128 的

那么在发生截断后,1000 0000 表示的就是一个补码,从这个补码可以看出来它的原码肯定是一个负数,那么我们根据这个补码反推得到它的反码:1111 1111,从而得到它的原码:1000 0000,可以看出这个值就是 -0,但是在我们的生活中是没有 -0 的,所以在计算机中就把它识别成 -128,因此这就是为什么 b 的值的输出是 -128 的原因。

ps: 关于 -0 对应于 -128 的具体解释,我懒得写了,因为感觉取决于个人的理解,不想细究,如果有人还有疑问,可以看看这个人的解释 byte类型取值范围为什么是127到-128? - 知乎

发表于 2018-05-14 21:22:39 回复(0)

在内存中表示形式( 注意 java 中是以补码表示一个数,所以表示形式是补码,不是原码! ):

发表于 2017-02-17 13:58:55 回复(0)
b = 1000 0000
求原码,取反+1:
0111 1111    再+1   1000 0000 (128)
本身为负数 为-128
发表于 2015-12-27 20:00:06 回复(3)
b = 1000 0000
求其对应正数原码:
-1: 0111 1111
取反: 1000 0000 = 128(忽略符号位)
所以b对应负数为-128
发表于 2015-07-29 15:30:59 回复(0)
这逗号不是中文字符???
发表于 2017-04-03 15:39:26 回复(0)
[1000 0000]作为补码表示-128不是算出来的, 是规定的,因为-0原码[1000 0000]在用原码规则来表示数是没有意义的,就浪费了这个编码, 所有要让这个编码有意义,就 整出来取反+1这套规则刚好能把-0原码【1000 0000】整到了-127【1000 0001】后面,所以用它来表示-128, 逻辑也正确: -128 = -127 - 1 = 【1000 0001】 - 1 = 【1000 0000】, 然后就把这套规则命名为补码,所以-0原码【1000 0000】在补码系统中表示-128不是推导的,是直接将-0原码【1000 0000】在补码系统中直接规定为补码表示-128
发表于 2016-10-14 11:40:36 回复(9)
正确答案应该是D,因为不可以输入中文分号😁
发表于 2019-10-22 18:16:42 回复(0)