【问题标题】:ulong, long conversion woesulong,长期转换困境
【发布时间】:2015-04-21 18:00:23
【问题描述】:

我在 C# 中有以下代码:

ulong value1 = 0x11234;
long value2 = (long) value1;

Console.WriteLine(value1);
Console.WriteLine(value2);

产生:

70196
70196

这不应该有所不同,因为 70196 在转换为 long 时会是负数吗?

[强制转换是否自动更改按位值?]

【问题讨论】:

  • 为什么你认为它是一个负数? (不是我的反对票)
  • @Hele 网上有很多例子可以将 ulong 转换为 long 做谷歌搜索
  • @sayse 因为这些位对于 ulong 和 long 意味着不同的东西
  • @Hele:不,他们没有。 2^63 远大于此。
  • @MethodMan 我找到了很多资源来进行转换,我的问题是为什么这段特定的代码会这样。

标签: c# type-conversion


【解决方案1】:

没有。负数用符号位表示,即最高位;在long 中,即为0x8000000000000000,当解释为ulong 时,它大于70196。

$ cat > test.cs
using System;

static class Application {
    static void Main() {
        ulong a = 0x8000000000000000;
        long b = (long)a;

        Console.WriteLine(a);
        Console.WriteLine(b);
    }
}
$ mcs test.cs
$ mono test.exe
9223372036854775808
-9223372036854775808

【讨论】:

    【解决方案2】:

    64 位整数0x11234 的位表示为0x0000000000011234。它是扩展的,前面是 0,而不是 1。

    当从 ulong 转换为 long 时,它仍然是 0x0000000000011234。负数为0x8000000000011234(MSB 设置为 1)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-03
      • 2016-02-25
      • 2015-06-12
      • 2012-01-10
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多