十六进制表示法和有符号整数
Posted
技术标签:
【中文标题】十六进制表示法和有符号整数【英文标题】: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 有什么区别?
【问题讨论】:
【参考方案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
【讨论】:
以上是关于十六进制表示法和有符号整数的主要内容,如果未能解决你的问题,请参考以下文章