首页 > 试题广场 >

变量a是一个

[单选题]
变量a是一个64位有符号的整数,初始值用16进制表示为:0x7FFFFFFFFFFFFFFF;变量b是一个64位有符号的整数,初始值用16进制表示为:0x8000000000000000。则a+b的结果用10进制表示为多少?
  • 1
  • -1
  • 2^63+2^62+…+2^2+2^1+2^0
  • –(2^63+2^62+…+2^2+2^1+2^0)
推荐
0x7FFFFFFFFFFFFFFF +  0x8000000000000000 =  0xFFFFFFFFFFFFFFFF 转为源码 = -1
编辑于 2017-05-23 18:19:57 回复(14)
感觉三位同学说的不太清晰,我来补充清晰版的,有问题欢迎指正。
a+b=0xFFFFFFFFFFFFFFFF,十六进制的F对应十进制的15,再转换成二进制则为1111
所以a+b得1111 1111 1111 1111,二进制的首尾为符号位,1位负数,0则为正数,这里为1所以a+b的结果是负数
负数在内存中存储以补码的形式,所以求原码的步骤为:
1.补码-1得反码(变为1111 1111 1111 1110)
2.反码按位取反得原码(1000 0000 0000 0001)
3.转换成二进制结果为-1
这道题我也做错了QAQ
编辑于 2018-08-29 21:12:13 回复(11)
这题可以用类比的方法来想,java中byte类型的表示范围是-128~127(0X80~0X7F),所以,,,你懂得~
发表于 2017-03-28 10:27:03 回复(19)
有符号位数的计算要先计算补码
正数的原码、反码、补码一样
负数的反码=除符号位外所有位取反 
负数的补码= 反码 + 1(符号位不参与运算)
0x7FFFFFFFFFFFFFFF 的补码 0111 1111 ... 1111
0x8000000000000000的反码 1111 1111 ... 1111  补码 1000 0000 ... 0000
补码相加 1111 1111 ... 1111 --> 转成反码 1111 1111 ... 1110 --> 转成原码 1000 0000 ... 0001  即-1
发表于 2017-07-29 14:19:51 回复(2)
首先,这里在计算机中存的已经是补码了,两数相加之后,是64位的1,我们需要求其原码,就需要数值位减一再取反,得到1000000...0001,也就是-1
发表于 2017-03-16 16:58:48 回复(4)
在vs2010实测,答案是-1。 假设只有一个字节 0x7f二进制为:0111 1111 0x80二进制为: 1000 0000 加起来为: 1111 1111 负数求源码除符号位取反加1 因此为: 1000 0001 就是-1。 如果错了,请指正。到目前为止我是这么理解的。
编辑于 2017-05-23 18:19:25 回复(10)
计算机中是以补码存储并参与运算的,所以题目中的初始值均是补码,并且我们通过补码参与运算后得到a+b=0xFFFFFFFFFFFFFFFF(结果还是补码),但是题目中要求我们用十进制表示,而进制转换是以原码转换的,所以我们要求出结果的原码。结果的反码=补码-1的二进制表示是11...111(63个1)最后一位是0,结果的原码是100...0(62个0)最后一位是1,十进制表示为-1。
发表于 2018-06-03 11:14:20 回复(0)
关键点:计算机使用补码参与运算,因此以下将题目中a、b的十六进制码转为的二进制都是视为补码,二者可直接相加

a -> 0x7FFFFFFFFFFFFFFF -> 二进制补码 -> 符号位是0,判断是正数(以每8位分隔)
01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

b -> 0x8000000000000000 -> 二进制补码 -> 符号位是1,判断是负数(以每8位分隔)
10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

以上两个二进制补码相加过程:

01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 a
+ 10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 + b
---------------------------------------------------------------------------
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 -> 相加结果即为实际结果值的补码,首位是1,判断为负数,下面转为原码:减去1再取反
-   00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001
---------------------------------------------------------------------------
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111110
---------------------------------------------------------------------------
10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 -> 取反结果,即为-1的原码
附上截图方便查阅:

编辑于 2017-12-12 01:51:00 回复(0)
初始值相当于补码:a + b = 111……111B(64位1)
减一变为反码:111……110B(中间都是1)
取反变为原码:100……001B(中间都是0)
变为10进制:-1
发表于 2017-08-23 19:04:47 回复(0)
答案应该是-1。计算机里数据是以补码形式参与计算的。所以两数相加后,补码全是1。转换为10进制就是-1
发表于 2017-01-20 23:03:06 回复(0)
public static void main(String[] args) {
		long a = 0x7FFFFFFFFFFFFFFFL;
		long b = 0x8000000000000000L;
		System.out.println(a + b);
	}
运行结果是
-1
发表于 2017-02-10 10:18:43 回复(1)
源码:f.......f(16) = 1.......1(64) 
负数反码:1..........0(64)
补码:1........1(64)
十进制:-1
正数:原码,反码,补码相同。
负数:反码(除符号位其余全取反),补码(反码+1)
发表于 2017-03-14 10:19:28 回复(0)
(1)a+b的16进制表示为:OxFFFFFFFFFFFFFFF(16位F),转为2进制为111……111(64位1,每个F->4位2)。
(2)有符号数:是针对二进制来讲的。用最高位作为符号位,“0”代表“+”,“1”代表“-”。所以a+b的结果是一个负数。
(3)计算机中负数是以补码的形式保存的,将补码转换成原码的计算方式如下:
        ①. 对于正数,原码与补码相同。
        ②.对于负数,将补码除符号位之外,按位取反,末位加1,即得到原码。
(4)a + b = 111……111(64位1)
          取反:100……000(1位1,后面63位0)
          加一:100……00(中间62位0)
      10进制:-1。
发表于 2017-05-09 10:51:16 回复(26)
a+b = 0xFFF...FFF,0xFFF...FFF+1 = 0,所以a+b =-1
发表于 2019-07-17 08:05:44 回复(0)
有符号整数如果第一位是1那么表示负数:
0x7FFFFFFFFFFFFFFF(正数补码是他自己) + 0x8000000000000000(符号位始终不变取反加一补码还是它自己) = 0xFFFFFFFFFFFFFFF(补码)    结果减1=FFFFFFFFFFFFFFF(1110),再取反(符号位不变)=1(62个0)1 = -1
0x7FFFFFFFFFFFFFFF(2^63-1) + 0x8000000000000000 (-2^63) = -1
发表于 2019-05-04 20:17:49 回复(0)
给整型赋值时可以使用十进制和十六进制 区别就在于十进制赋值时可以写正负 如果是正数,那么内存就是存放的数的二进制 如果是负数,内存中存放的就是补码 而十六进制赋值不能指定正负 那么十六进制数在内存中就是以数的二进制方式存放的(可根据十六进制数的二进制指定符号位)
发表于 2018-09-17 01:59:46 回复(0)

还是(a+1)+b-1靠谱

发表于 2018-08-10 16:14:20 回复(0)
如果题目给的两个初始值分别是0xff 和0x11, 还会有人认为这是补码吗?
我觉得初始值就是真值,题目中的真值换成十进制分别是2^63-1 和 2^63,但当存储到有符号的64位的变量中后, 2^64-1 最高位为0,即为64有符号数的最大值 == INT64_MAX; 而 2^63最高位为1,其它位为0,即为负0,计算机中规定负0表示-2^63,即为64位有符号的最小值,两者根据普通加减法相加,值为-1。
发表于 2018-07-19 10:04:37 回复(0)
用八位表示 0x7f为正数最大值 即127 0x80为负数最小值即-128 和为-1
发表于 2018-04-18 17:20:16 回复(0)
重点:计算机的负数是以补码的形式存储的.负数的补码等于其反码加一.同理已知负数补码,其源码为减一按位取反再
发表于 2018-03-16 01:55:19 回复(0)
变量a是一个正数,变量b是一个负数,从绝对值的角度来说,变量b比a大1
发表于 2017-10-24 22:18:16 回复(0)