首页 > 试题广场 >

变量a是

[单选题]
变量a是一个64位有符号的整数,内存中用16进制表示为:0Xf000000000000000; 变量b是一个64位有符号的整数,内存中用16进制表示为:0x7FFFFFFFFFFFFFFF。 则a-b的结果用10进制表示为多少?()
  • 1
  • -(2^62+2^61+2^60+1)
  • 2^62+2^61+2^60+1
  • 2^59+(2^55+2^54+…+2^2+2^1+2^0)
推荐
0Xf000000000000000补码为1111000000000000000000000000000000000000000000000000000000000000
0x7FFFFFFFFFFFFFFF补码为0111111111111111111111111111111111111111111111111111111111111111
a-b=a+(-b)=
1111000000000000000000000000000000000000000000000000000000000000+
1000000000000000000000000000000000000000000000000000000000000001=
10111000000000000000000000000000000000000000000000000000000000001(高位溢出舍去)
则结果为
0111000000000000000000000000000000000000000000000000000000000001=
2^62+2^61+2^60+1
答案为C
代码验证
编辑于 2017-05-23 13:52:06 回复(44)

(1)原码是符号位加上真值的绝对值,即用第一位表示符号位,其余位表示值。

(2)正数的反码是其本身。负数的反码是在原码的基础上,符号位不变,其余按位取反。

(3)正数的补码是其本身。负数的补码是在原码的基础上,符号位不变,其余按位取反,最后加1。

(4)计算机进行符号运算时,会以补码表示,符号位和数字位会一起参与运算。

a-b实际转换为[a-b]补=[a]补+[-b]补

a为1111(后面60个0),1开头,所以为一个负数;补码为1001(后面60个0)

b为0111(后面60个1),0开头,所以为一个正数;补码为其本身。

-b为1111(后面60个1),补码为1000(后面59个0,最后有个1)

所以1001(后面60个0) + 1000(后面59个0.最后有个1) = 0001(后面59个0,最后有个1),发生了溢出,比如采用双高位判别法处理溢出,则补码1001(后面59个0,最后有个1)转换为原码为1110(后面60个1),即-(7 *2的60次方+1)=-(2的62次方+2的61次方+2的60次方 +  1)

答案:-(2^62+2^61+2^60+1)

发表于 2017-08-25 17:24:58 回复(10)
十六进制,一个数字代表四位,a中的唯一一个f是15也就是8+4+2+1,也就是说四位都是1。b中的7是4+2+1,也就是说是0111。也就是说a是11110000...0,b是0111...1,相减是011100...001,换算十进制就是答案了。
发表于 2017-11-10 13:47:55 回复(1)
这道题只要注意a是负数。负数在计算机中是以补码的形式存在的。而正数虽然也是以补码存在的,但是正数的补码和其本身一样。
发表于 2017-03-01 22:17:33 回复(5)
初始值就是补码。所以可以直接算:
a-b = a+(-b) = 11110000000000..... + 100000000.....000001 = 011100000.......000001,所以选C
编辑于 2017-05-01 21:35:37 回复(1)

C

0xf000000000000000-0x7FFFFFFFFFFFFFFF=0X7000000000000001L =111+15*4个0+1=2^62+2^61+2^60+1

发表于 2017-04-03 15:01:43 回复(3)
原码:在数值前直接加一符号位的表示法。
反码:正数:正数的反码与原码相同。负数:负数的反码,符号位为“1”,数值部分按位取反。
补码:正数:正数的补码和原码相同。负数的补码则是符号位为“1”。并且,这个“1”既是符号位,也是数值位。数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。
如+7的原码,反码,补码都是00000111
-7的原码为10000111,反码为11111000,补码为11111001;
A-B就是A+(-B)补
16进制转二进制,每一位16进制位等于4位二进制位
所以 a为 1111 0000.........00000(60个0)
        b为 0111 1111..........11111(60个1)
       -b为 1111 1111..........11111(60个1)
   -b补为 1000 0000..........0001
最后a+(-b)补为 0111 0000......00001 (只有64位,最高的被进位进掉了)
即2^62+2^61+2^60+1
发表于 2019-03-08 15:06:25 回复(0)
a为11110000000000(1后60个0) 首位为1 所以为负  原码应该为1001000000(1后60个0)即-2^60
b为8*2^60 -1    相减之后为-9*2^60+1 溢出  10010000000(1后59个0)1
转为原码为  1110111111111111(0后60个1)   -7*2^60-1
即-(2*2^62+2*2^61+2*2^60+1)
是这样吗
编辑于 2017-03-02 18:45:13 回复(3)
0x7FFFFFFFFFFFFFFF+1=0X8000000000000000,那么
a-b=0Xf000000000000000-0X8000000000000000+1
=0X7000000000000001
=16^15*7+16^0*1
=2^60*7+1
=2^60*(2^2+2^1+2^0)+1
=2^62+2^61+2^60+1
发表于 2017-08-04 13:23:41 回复(17)
那个我想问一下,二进制真的有必要弄懂吗
发表于 2020-11-17 16:53:22 回复(0)
我只想问明显a是负数 b是正数 a-b出来应该是负数  当然如果忽略移除当我没说
发表于 2020-09-01 21:29:22 回复(0)
立即推,直接放弃。
发表于 2018-05-25 18:10:00 回复(2)
看了这么解答,终于有个清晰的理解了。
因为在计算机进行符号运算时,都以补码进行运算,所以题中的初始值默认都是补码形式。
a-b的值其实就是[a-b]的补码,[a-b]补码=[a]补+[-b]补。
[a]补即为将初始值转成二进制11110000......0;
b的值为01111.......1,-b为11111.......1,则[-b]补为-b符号位不变,其余各位取反加1=1000.....1。
所以[a]补+[-b]补=11110000......0+1000.....1=10111.....1,高位溢出截断。所以值为2^62+2^61+2^60+1
发表于 2018-02-17 19:53:29 回复(4)
这题可以排除法做
发表于 2017-05-25 16:23:10 回复(0)
牛皮!这种题该回!!
发表于 2020-03-27 00:43:50 回复(0)
题目给出的初始值是在计算机存储形式,即补码形式。a为负数,b为整数。
a-b = a + (-b)——思路是先得到(-b)的补码形式,然后将a的补码与(-b)的补码相加。
a的补码题目已给出: 0xF000000000000000
-b的原码:0xFFFFFFFFFFFFFFFF
-b的反码:0x8000000000000000
-b的补码:0x8000000000000001
a-b = 0xF0000000000000000x8000000000000001
      = 0x7000000000000001
      =  2^62 + 2^61 + 2^60 + 1
负数-正数 = 正数?这是因为计算机存储字节长度的限制导致的最高位溢出。
发表于 2019-05-24 10:57:39 回复(1)

[a-(b+1)]+1

发表于 2018-08-10 10:55:20 回复(0)

a-b实际转换为[a-b]补=[a]补+[-b]补

a为1111(后面60个0),1开头,所以为一个负数;补码为1001(后面60个0)

b为0111(后面60个1),0开头,所以为一个正数;补码为其本身。

-b为1111(后面60个1),补码为1000(后面59个0,最后有个1)

所以1001(后面60个0) + 1000(后面59个0.最后有个1) = 0001(后面59个0,最后有个1),发生了溢出,将溢出舍去,将补码1001(后面59个0,最后有个1)转换为原码为1110(后面60个1),即-(7 *2的60次方+1)=-(2的62次方+2的61次方+2的60次方 +  1)

答案:-(2^62+2^61+2^60+1)

编辑于 2018-04-17 16:27:38 回复(0)
~b=-b-1 现在存放得都是补码 进行运算后,再转为源码即可。 a=1111 0000。b=0111 1111。推出-b=1000 0001。 则a-b=1111 0001
编辑于 2017-03-14 10:08:02 回复(0)
首先:负数,原码转补码:取反加1。
如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
计算:
a初始值为0Xf000000000000000,如果这是原码。求出补码1001 00。。00
b初始值0x7FFFFFFFFFFFFFFF,原码且正数,补码就是本身,但是题目是减,所以-b的原码:FFFFFFFFFFFFFFFF.求其补码:
1000 00000000。。0001,计算机只能计算补码。因此补码相加得0001 0000000。。000001发现没有结果。说明是题目给的是补码。
那么现在:
a补码1111000000000000000000000000000000000000000000000000000000000000
b需要先转为原码才能加负号,而b为正数,所以原码就是补码,现在-b原码为FFFFFFFFFFFFFFFF,求补码得1000 0.。。01
现在相加:0111 0000000000000000000000000000000001,这样算是对的。

编辑于 2019-01-20 11:07:41 回复(2)
遇到带FFFFFF的题可以考虑为其+1。
0X8000000000000000=0x7FFFFFFFFFFFFFFF+1,
原式 = a-b = 0Xf000000000000000 - 0X8000000000000000 + 1
0X7000000000000001
= 16^15*7 + 16^0*1
= 2^60*7 + 1
= 2^60*(2^2+2^1+2^0) + 1
= 2^62+2^61+2^60+1,选B
发表于 2018-09-02 08:56:45 回复(2)