11

这是一个后续问题。因此,Java 将整数存储在二进制补码中,您可以执行以下操作:

int ALPHA_MASK = 0xff000000;

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

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

4

3 回答 3

25

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

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

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

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

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

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

于 2008-11-26T07:47:36.973 回答
7

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

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

或者

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

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

于 2008-11-26T07:52:15.137 回答
0

只是为了增加对伤害的侮辱,这也将起作用:

-0x7F000000
于 2010-03-19T21:04:59.063 回答