对于C语言和Java语言写的这两段程序,哪一个结果符合题目要求?还是都不符合?请大侠们赐教!!!

解决方案 »

  1.   

    按照题目要求:
    b1 : 1000 0000
    b2 :           1000 1111
    将b1和b2看出无符号数,按byte1 << 8 | byte2运算得
    result:1000 0000 1000 1111
    将result看成带符号数,转换成10进制表示是不是-81呢?如果将一个数看作带符号数,则其最高位是符号位。计算这个数的绝对值时,符号位参不参与运算?
      

  2.   

    刚刚测试一下,发现个新问题,假设有:
    b3 = 0x7f, 即:0111 1111
    b4 = 0x80, 即:          1000 0000
    将b3和b4看成无符号数,按byte1 << 8 | byte2运算得
    result:0111 1111 1000 0000
    将result看成带符号数,转换成10进制表示应该是32640吧?可是这段代码得到的运算结果是-128:
      byte b3 = 0x7f;
      byte b4 = (byte)0x80;
      int result = (b3 << 8) | b4;
      System.out.println(String.format("%d", (short)result));这是怎么回事呢?
      

  3.   

    问题是这样:
    java 中 byte 是有符号的,| 的时候,两边自动扩展成 int
    b1 << 8 | b2
    b1 << 8 = 0.. 0111 1111 0000 0000
    b2 作为 byte 是 
                            1000 0000,
    扩展成 int 就不得了了,
              1.. 1111 1111 1000 0000 
    然后 b1 << 8 再 | b2, b2 前面都是1,最终结果当然还是
              1.. 1111 1111 1000 0000
    就是 -128,
    正确的做法是:
     int result = ((b1 << 8) & 0xFFFF) | (b2 & 0xFF);
    结果就正确了
      

  4.   

    结果真的正确,谢谢 crow_soup() 。
    但俺还是不知道为什么 ((b1 << 8) & 0xFFFF) | (b2 & 0xFF)这样就行呢说说道理吧?如果题目要求稍为改一下,把b1和b2还是看作无符号数,其运算方式要求改为:
    (b1 <<24) | (b2 <<16),那么实际写java程序时,这一句该写成什么?是不是:((b1 <<24) & 0xffffffff | (b2 <<16) & 0xffffff
    这样写对不对?
      

  5.   

    自己琢磨了一下,b2 & 0xFF 的用意是将最高位转为0(如果原来最高位是1的话),这样会不会改变原来b2的值吗?为什么还会得到正确的结果呢?
      

  6.   

    噢,好像上面自己琢磨错了。b2 & 0xFF 运算之前,会将b2扩展成int形式:
                1111 1111 1111 1111 1111 1111 1000 0000
    而0xff的是:0000 0000 0000 0000 1111 1111 1111 1111
    两者相&之后,将b2的第0个字节和第1个字节全部改为0了。
      

  7.   

    咦,
    0xff 应该是 0000 0000 0000 0000 0000 0000 1111 1111 吧,我为什么在版面上看不到这篇文章了呢?
      

  8.   

    对于无符号数,你用short或char型存储就行了
    判断byte小于0,+256就是
      

  9.   

    发现一个新问题:以下代码的运算结果是-128,但本人认为是4294967168才对呀???  int b1 = 0xff;
      int b2 = 0xff;
      int b3 = 0xff;
      int b4 = 0x80;
      int result = (b1 << 24) | (b2 << 16 ) | (b3 << 8) | b4;
      System.out.println(String.format("%d", result));
      

  10.   

    :S32位的带符号的int FFFFFF80 不就是 -128 吗?