ulong,长期转换困境

Hel*_*ele -1 c# type-conversion

我在C#中有以下代码:

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

Console.WriteLine(value1);
Console.WriteLine(value2);
Run Code Online (Sandbox Code Playgroud)

产生:

70196
70196
Run Code Online (Sandbox Code Playgroud)

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

[演员表会自动更改按位值吗?]

Ry-*_*Ry- 6

不是.负号由符号位表示,符号位是最高位; 在a long,那是0x8000000000000000,并且当被解释为a时,它大于70196 ulong.

$ 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
Run Code Online (Sandbox Code Playgroud)


E. *_*fat 5

64位整数的位表示0x112340x0000000000011234.它在前面扩展为0,而不是1.

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