【问题标题】:Hexadecimal notation and signed integers十六进制表示法和有符号整数
【发布时间】:2010-09-24 02:46:12
【问题描述】:

这是follow up question。因此,Java 将整数存储在 two's-complements 中,您可以执行以下操作:

int ALPHA_MASK = 0xff000000;

在 C# 中,这需要使用无符号整数 uint,因为它将其解释为 4278190080 而不是 -16777216

我的问题,如何在 c# 中以十六进制表示法声明负值,以及整数在内部如何表示?这里和 Java 有什么区别?

【问题讨论】:

    标签: c# types hex


    【解决方案1】:

    C#(更确切地说,.NET)也使用二进制补码,但它同时支持有符号和无符号类型(Java 不支持)。位掩码更自然地是一个无符号的东西 - 为什么一个位应该与所有其他位不同?

    在这种特定情况下,使用未经检查的强制转换是安全的:

    int ALPHA_MASK = unchecked((int)0xFF000000);
    

    要“直接”将此数字表示为有符号值,请编写

    int ALPHA_MASK = -0x1000000; // == -16777216
    

    十六进制与十进制没有(或不应该)有任何不同:要表示负数,您需要写一个负号,后跟代表绝对值的数字。

    【讨论】:

      【解决方案2】:

      好吧,您可以使用未检查的块和强制转换:

      unchecked
      {
          int ALPHA_MASK = (int)0xff000000;
      }
      

      int ALPHA_MASK = unchecked((int)0xff000000);
      

      虽然不太方便...也许只使用文字整数?

      【讨论】:

      • 我不知道 C# 有这个关键字。酷!
      【解决方案3】:

      而且只是雪上加霜,这也可以:

      -0x7F000000
      

      【讨论】:

        猜你喜欢
        • 2021-08-13
        • 2017-08-10
        • 1970-01-01
        • 1970-01-01
        • 2013-09-06
        • 2016-05-07
        • 1970-01-01
        • 1970-01-01
        • 2011-06-06
        相关资源
        最近更新 更多