c# - 十六进制表示法和有符号整数

标签 c# types hex

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

int ALPHA_MASK = 0xff000000;

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

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

最佳答案

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

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

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

要“直接”将此数字表示为带符号的值,您可以编写

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

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

关于c# - 十六进制表示法和有符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/319993/

相关文章:

C# 缺少 MSVCR100.dll

c# - 如何为 "123456#"编写正则表达式以打印 123456?

c# - 为什么 .NET Core 在 Raspbian 上以不同方式处理 ReadKey?

c# - Zip 然后将多个文件加密到一个存档中

typescript - TypeScript 中的交集和合并类型 `{ foo } & { bar }` 和 `{ foo, bar }` 之间的区别

python - 在Python中将十六进制转换为负整数

haskell - 在 Haskell 中解构类型

types - 与文字的可区分联合

java - 将奇数长度的java字符串转换为十六进制字节数组

hex - 为什么十六进制数的前缀是 # 而不是 0x?