代码之家  ›  专栏  ›  技术社区  ›  jack-london

如何对德沃德说两个字

c#
  •  0
  • jack-london  · 技术社区  · 16 年前
            short val1 = short.MaxValue;
            short val2 = short.MaxValue;
    
            int result = val1;
            result |= val2 << 16;
    
            Console.WriteLine( "Result =\t" + result );         //2147450879
            Console.WriteLine( "Expected =\t" + int.MaxValue ); //2147483647
    
    4 回复  |  直到 16 年前
        1
  •  1
  •   Jon Watte    16 年前

    看起来像C。短签名。扩展为int的有符号负值将填充所有最左边的16位。因此,只要“val1”为负值,建议的代码就会失败。

    此代码有效(请注意,WORD和DWORD是无符号量):

      public static uint MakeDWord(ushort a, ushort b) {
        return ((uint)a << 16) | b;
      }
    
        2
  •  8
  •   Joey Gumbo    16 年前

    short 是有符号的,因此最大值为 0x7FFF . 将此结果连接到 0x7fff7fff 0x7fffffff 是2147450879。所以你看到的事实是正确的。

        3
  •  1
  •   Fredou    16 年前

            ushort val1 = ushort.MaxValue;
            ushort val2 = ushort.MaxValue;
    
            int result = val1;
            result |= val2 << 15;
    
        4
  •  0
  •   jichi    14 年前

    试试这个,类似于<windef.h>:

    #define MAKEDWORD(_a, _b)   ((DWORD)(((WORD)(((DWORD_PTR)(_a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(_b)) & 0xffff))) << 16))