无符号整数的一元求反
本文关键字:一元 无符号整数 | 更新日期: 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。