我希望将这行C代码转换为C#:
const u64 a = 1, b = -a;
所以我的理解是两个常量都是无符号的64位整数。如果是这样,结果会是什么样的?
或者是实际提升的第二个常量,因此被定义为有符号整数?
答案 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。