【问题标题】:Hex literal of Int64.MinValueInt64.MinValue 的十六进制文字
【发布时间】:2014-04-24 07:43:58
【问题描述】:

我正在尝试将 Int64.MinValue (-0x8000000000000000) 写为负十六进制,但 Visual Studio 2010 不允许我这样做,因为它假定 0x8000000000000000 必须是 ulong 文字,并且无符号数不能为负数。有解决方法吗?我注意到在另一个线程中使用了 checked 关键字,但它并没有解决这个问题。在这种情况下,我真的很想使用十六进制表示法而不是十进制。

有趣的是,十进制表示法不会发生这种情况。

【问题讨论】:

  • 你能把结果乘以-1吗(不确定它是否会起作用,因为你错过了符号位)
  • 我不能。这是确切的错误:运算符“-”不能应用于“ulong”类型的操作数
  • 只是出于好奇:将值表示为十六进制文字的具体原因是什么?
  • 十六进制在我使用位运算符的上下文中更明智。

标签: c# visual-studio-2010 hex


【解决方案1】:

这显示了几种可能的实现方式:

static void Main(string[] args)
{
    Int64 minValue = -9223372036854775808;
    Int64 minValueViaHex = Int64.Parse("8000000000000000", NumberStyles.AllowHexSpecifier);
    Int64 minValueViaHexInline = unchecked((long)0x8000000000000000L);

    Console.WriteLine("Decimal match : {0}", Int64.MinValue == minValue);
    Console.WriteLine("Via Hex match : {0}", Int64.MinValue == minValueViaHex);
    Console.WriteLine("Via Hex inline: {0}", Int64.MinValue == minValueViaHexInline);
}

这个输出:

Decimal match : True
Via Hex match : True
Via Hex inline: True

【讨论】:

  • 我目前正在使用十进制表示法,但它看起来不正确。
  • @toplel32 - 当然,出于好奇,您为什么不直接使用Int64.MinValue,因为这可能最容易阅读?
  • 为了一致性。我在同一方法中使用其他文字来表示单个位。
【解决方案2】:

这个怎么样?

const Int64 test = unchecked((long)0x8000000000000000);
Trace.Assert(test == Int64.MinValue);

或者这不是你的意思?

【讨论】:

  • 是的,这会产生正确的结果。 unchecked 关键字究竟做了什么?
  • @toplel32 它可以让编译器不用担心溢出,在这种情况下是可以的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 2023-03-14
  • 2011-12-09
  • 2020-10-27
  • 2017-09-13
  • 2018-07-26
相关资源
最近更新 更多