无符号整数的一元求反

本文关键字:一元 无符号整数 | 更新日期: 2023-09-27 18:23:55

我想把这行C代码转换成C#:

const u64 a = 1, b = -a;

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

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

无符号整数的一元求反

这将是等价的C#:

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

或者更简单地说:

const ulong a = 1, b = 18446744073709551615;

C#编译器会试图保护您不意外地否定一个无符号整数,但您可以这样强制:

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

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

由于否定无符号整数的行为,-(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;

您会得到一个不明确的调用错误,因为-1不可能是无符号类型(请参阅下面的注释)。您必须使用Int64作为类型(等于long)。

当使用long-as类型时,结果将是a=1,b=-1,并且两个都是long。