首页 > 试题广场 >

变量a是一个64位有符号的整数,初始值用16进制表示为:0x

[单选题]
变量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)
补码定点数加法运算 [A+B]补 = [A]补 + [B]补 符号位参与运算,符号位产生的进位丢掉
0x7FFFFFFFFFFFFFFF
+0x8000000000000000
= 0xFFFFFFFFFFFFFFFF
非符号位取反加一得原码 10000....01 即十进制 -1
编辑于 2020-02-28 11:09:08 回复(0)
最简单的方法如下:

0x7FFFFFFFFFFFFFFF + 1 = 0X8000000000000000,那么

 a + b =  0X8000000000000000 - 1 + 0x8000000000000000 = -1  added by Guoqing Du

发表于 2019-06-28 12:37:22 回复(0)

直接二进制相加,然后补码原码 除符号位全部取反后加1。最后得到-1

发表于 2019-06-25 00:13:09 回复(0)
写给自己~计算机里面的数是以补码形式保存,两数相加时,可以先将两补码相加,然后保持符号位不变,按位取反再加1,得到结果。
发表于 2020-03-28 21:03:25 回复(0)
这其实是个很特殊的数。0和-0。
1(0000...0)代表的不是-0,而是-2^16次方
而7fffffff.. 代表的是2^16-1
所以a+b为-1
就这一个特殊的地方。-0和0的区别。0的补码就看成是开头是0的正数。-0其实代进去算不对。而代入它的-1的补码的后面一个那个数就对了。这个跟进位和符号位有关。
写个8进制的你可以转换着对照下。
0(7个0)~0(7个1) 0~255
1(7个0)~(07个1) -1~-256
而10000000就表示-256的原码和补码,它的原码和补码是一样的。因为进位两次,转换为十进制代入-0算不对。
10000001表示-255的补码   11111111表示-255的原码
这个就是有符号的表示范围。在这个范围内计算不会错。超出范围就叫溢出。不管是超出-256还是超出255都是溢出。
符号位和补码间的进位设计的很巧妙。到了溢出实在是没办法就交给计算机处理了。所以记住对应的范围就好。

或者最简单的。全部换成补码去算。补码的求法。开头是0的就不变。开头是1的就开头1照着写,后面的数取反加1,但是进位要丢掉,开头的1不能动。然后照着二进制去算。算出来后再求一次补码,变成原码。补码的求法,依旧是看开头是0还是1。最后得出的就是原码。转换一下进制就好。

求的过程中看前两位是否进位一致,进位一致没有溢出,得出的结果是正确的。否则题目设计不合理,位数要扩展才能算。
编辑于 2020-03-28 16:46:43 回复(0)

0x7FFFFFFFFFFFFFFF + 1 = 0X8000000000000000,那么

a + b = 0X8000000000000000 - 1 + 0x8000000000000000 = -1


发表于 2019-06-28 15:42:32 回复(1)

直接相加 1111…然后除符号位取反

1000…然后加1 得 -1

编辑于 2019-10-29 11:32:21 回复(0)
计算机中的二进制位都是以有符号的补码形式储存
编辑于 2019-09-22 17:06:34 回复(0)
64位无符号整型数范围是(-2^64,2^64-1)
其中1000 0000 .... 表示的是-2^64
0000 000 ....表示0
最高位为符号位
因此a+b=-1
发表于 2019-08-24 17:25:12 回复(0)