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

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

【讨论】:

以上是关于十六进制表示法和有符号整数的主要内容,如果未能解决你的问题,请参考以下文章

整数在计算机中的表示

C中的无符号十六进制常量?

计算机中数的表示形式 原码 反码 补码

关于c语音,二进制问题?

《软件设计师》1

20145339《信息安全系统设计基础》第3周学习总结