无符号整数的一元否定

时间:2012-02-08 02:21:57

标签: c# c

我希望将这行C代码转换为C#:

const u64 a = 1, b = -a;

所以我的理解是两个常量都是无符号的64位整数。如果是这样,结果会是什么样的?

或者是实际提升的第二个常量,因此被定义为有符号整数?

4 个答案:

答案 0 :(得分:4)

这将是等效的C#:

const ulong a = 1, b = unchecked((ulong)-1);

或更简单:

const ulong a = 1, b = 18446744073709551615;

答案 1 :(得分:2)

C#编译器会尽量保护你不会无意地否定无符号整数,但你可以这样强制它:

ulong a = 1;
ulong b = (ulong)-(long)a;

结果将是与否定有符号整数(即二进制补码)时完全相同的一组位,唯一的区别是这些位是如何解释

答案 2 :(得分:1)

由于behaviour of negating unsigned integers-(u64)1的表示全部为1。所以,经过以下几点:

const u64 a = 1, b = -a;

// a is now 0x0000000000000001
// b is now 0xffffffffffffffff

当然,0xffffffffffffffff也是(2^64) -1,即18446744073709551615。

在我看来,原来的程序员可以更清楚地写一下:

const u64 a = 1, b = ~(u64)0;

我不是C#程序员,但我怀疑以下内容适合您:

const ulong b = ~(ulong)0;

答案 3 :(得分:0)

您会收到一个模糊的调用错误,因为无法将-1作为无符号类型(请参阅下面的注释)。您必须使用Int64作为类型(等于long)。

当使用long作为类型时,结果将是a = 1,b = -1和两个long。