首页 > 试题广场 >

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

[单选题]
经过强制类型转换以后,变量a, b的值分别为( )short a = 128; byte b = (byte) a;
  • 128  127
  • 128  -128
  • 128  128
  • 编译错误
推荐
1、Java中用补码形式表示
2、第一位正负位,1表示负,0表示正。
3、原码:一个数的二进制表示。
                 3的原码00000011   -3的 原码 10000011
4、反码:负数原码按位取反(符号位不变)。正数原码本身。
                3的反码00000011   -3的反码11111100
5、补码:正数是原码本身。负数反码加1。
                 3的补码是00000011  -3的补码是11111101
-------------------------------------------------------------------------------
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=反码,反码按位取反=该负数绝对值
已知负数,求负数的补码:
1、负数原码除了符号位,按位取反(不含符号位),加1。
2、负数绝对值的补码(也就是原码),按位取反(含符号位),加1
-------------------------------------------------------------------------------
例子:
java int 128转为byte,值:
128为正数,补码为10000000(前面24个0省略),变成byte,只剩下10000000(byte为1个字节),因为开头是1,所以为负数。即1个负数的补码是10000000。反码是01111111,原码是1000000。是128.因为是负数,所以是-128。
编辑于 2019-01-08 15:02:54 回复(22)
上面的解释好像都有点瑕疵,java中short占用2bytes,强转short类型为byte,会将多出的高8位进行截断,short类型的 128的补码:0000 0000 1000 0000,强转为byte后的补码:1000 0000,我们认识的是原码,所以需要求1000 0000的原码,再次对补码的真值位(符号位以外的)取反加一(或减一取反)即可得到原码为1111 1111+1=1100 00000,发现溢出了多出一位,计算机仍然将多出一位进行截断,保留为1000 0000,表示-0,注意,没有-0,只有0,而byte占用8bit,可以表示256个数,-127-127(对应的原码:1111 1111-- 0111 1111)都能表示出来,则共表示255个数,还差一个,所以为了充分利用资源,就将原来本应该表示“-0”的原码规定为代表-128,故结果为-128,有符号的byte类型也就能够表示的范围是-128-127.
编辑于 2018-08-30 10:38:49 回复(19)
答案:B
byte在内存中占一个字节,范围是 -128到127之间。
将128强制类型转换为byte型,就超出了byte型的范围,
128的二进制存储是 1000 0000 转换为byte型后,最高位是符号位,值是-128
编辑于 2019-01-08 15:02:54 回复(4)
a=0000000010000000,当进行强制转换时,byte是八位的,截取a的后八位,b=10000000;最高位是符号位,说明b是负数,在计算机中以补码表示,求其源码,先减1得到反码01111111,取反得到源码10000000,也就是-128.
发表于 2015-12-24 09:15:45 回复(5)
八位 0000 0000:能存储2^8 - 1 = 255,byte型有正负(-128 - 127),那就第一位符号位。(以下两行为补码)
0000 0000 - 0111 1111 即     0  -> 127
1000 0000 - 1111 1111 即 -128 -> -1

short的128 强制转换成byte后,第一位变成了符号位 --- >1000 0000(这个是补码)




发表于 2016-03-09 00:09:36 回复(0)

评论的很多是在误人子弟…128带上符号位是九位,截断成8位后实际意义是-0也就是10000000这个补码在转原码应先减一后取反(无关符号位,这也是为什么我觉得很多人误人子弟的地方)10000000-1=11111111。取反后还是10000000 我们说八位带符号二进制表示的范围是-127~127这当中总共有几个数呢?没错是256个数,256=127*2+2,所以0就有+0和-0的区别,为了充分利用这一个空间,才规定的-0=-128的,没错,这是规定!

发表于 2019-04-06 11:06:48 回复(1)
把short当做byte了😓
发表于 2017-09-25 17:59:53 回复(0)
B.
byte的范围是127~-128之间,将short类型的128强制转换为byte类型,超出了byte类型的范围,超出了一位,就变成了-128
发表于 2015-08-19 16:52:00 回复(0)
上面的解释好像都有点瑕疵,java中short占用2bytes,强转short类型为byte,会将多出的高8位进行截断,short类型的 128的补码:0000 0000 1000 0000,强转为byte后的补码:1000 0000,我们认识的是原码,所以需要求1000 0000的原码,再次对补码的真值位(符号位以外的)取反加一(或减一取反)即可得到原码为1111 1111+1=1100 00000,发现溢出了多出一位,计算机仍然将多出一位进行截断,保留为1000 0000,表示-0,注意,没有-0,只有0,而byte占用8bit,可以表示256个数,-127-127(对应的原码:1111 1111-- 0111 1111)都能表示出来,则共表示255个数,还差一个,所以为了充分利用资源,就将原来本应该表示“-0”的原码规定为代表-128,故结果为-128,有符号的byte类型也就能够表示的范围是-128-127.
发表于 2019-07-13 19:14:37 回复(0)
byte占位1字节位127~-128
发表于 2018-04-08 10:05:02 回复(0)
首先得知道三个知识点:
正数的补码等于其自身。 
负数的补码等于模- 负数的绝对值。
补码求源码?  
前一半的补码的值 = 原码 自身 ;    后一半的补码对应的原码=  补码值- 模
注意补码没有符号位一说,都为正数。
因此,a = 128 . 对应到byte (前一半为0 -127, 后一半为128 -255)
转换为原码等于 128 - 256 = -128
以上。

发表于 2018-02-13 17:53:00 回复(0)
在Java中,short类型占2个字节,byte类型占1个字节
发表于 2015-10-06 15:49:36 回复(0)
这个是Java编码方式决定的,Java中正数用源码表示,负数用补码表示,第一位是符号位。
发表于 2015-04-14 23:07:41 回复(1)
a 的原码是10000000   反码是 10000000    补码是10000000    (正数的原码、反码、补码一样)
   计算机中以补码形式存数字
   short是2字节16位,存的形式为:00000000 10000000(首位是符号位)
   byte是1字节8位,截取前面8位后 补码10000000,是负数。其原码算出来是 1 10000000 。舍掉前头的1为10000000。即 -0 然后实际上是 -128

发表于 2019-05-23 18:48:27 回复(0)
如果一个数为正整数则有二进制源码==反码==补码,若为负数则反码是源码按位取反,补码等于反码加一
发表于 2019-05-14 16:57:03 回复(0)
B
发表于 2019-05-04 12:27:45 回复(0)
取反加一不应该是10000 0000吗
发表于 2019-04-16 10:45:26 回复(0)
java中整数不是默认是int类型的,short a = 128 不强转的话不会报错吗?
发表于 2019-04-02 09:34:58 回复(0)
为什么我用IDEA是编译错误


发表于 2019-03-19 12:44:20 回复(1)
内存溢出
发表于 2019-01-14 20:46:00 回复(0)
java中用补码表示:
第一位表示符号位:1负0正
正数的原码=反码=补码
负数的原码:化为二进制
            反码:符号位不变,再按位取反
            补码:反码+1
128为正数,补码为10000000(前面24个0省略),变成byte,只剩下10000000(byte为1个字节),因为开头是1,所以为负数。即1个负数的补码是10000000。反码是01111111,原码是1000000。是128.因为是负数,所以是-128。
发表于 2018-10-19 15:20:23 回复(0)