我在 C++ 和 C# 中遇到过一些关于 uint 用法的类似问题,现在我想知道其中的原因(每个示例可能完全不同)。对于这两个示例,请注意我在将警告级别设置为最大的情况下进行编译。
(1) gcc 提示在下面比较 int 和 uint,而 vc++ 没有:
uint foo = <somevalue>;
if( foo == ~0 ) //right here
...
在 gcc 和 vc++ 上与 0 进行比较就可以了,无需任何强制转换。
(2) 在 C# 3.5 中,我遇到了类似的问题。以下工作正常:
uint foo = 1;
uint bar = 2;
但这给出了一个 uint/int 警告:
bool condition = <somevalue>;
uint foo = condition ? 1 : 2; //right here
为什么编译器对立即值的符号性如此敏感?我完全理解从变量分配时的问题,但这对我来说对于立即值来说没有意义;在阻止这种行为被允许的解析中是否存在一些隐藏的困难?或者什么?
编辑:是的,我知道我可以在我的数字后面加上“u”,但这回避了我的问题,即关于隐式向左转换的问题-侧,而不是显式转换右侧。
最佳答案
在没有明确程序员意图的情况下混合有符号和无符号值会导致细微的错误。的确,int 和 uint 都存储在相同大小(4 字节)的内存位置中,并且位置分配兼容,但它们在常见操作方面的位表示和行为是不同的,而且它们的范围也不同。
这就像解决一道数学题,说为什么我不能把[-2147483648到2147483647]区间和[0到4294967295]区间自由交换?好吧,你可以,但如果你越界,结果可能不正确 :)。这就是为什么编译器会要求您确认(明确表示)您没有错误地混合不同的类型。
此外,在 C# 中,文字数字始终为 int32,如果您需要一些其他文字类型,如 float、decimal、ulong 等,您需要使用适当的后缀,在您的情况下:
uint foo = condition ? 1u : 2u; // uint literals;
编辑:正如 Andrew Hare 所指出的,C# 整数文字不仅是 int32,而且还取决于大小 (int, uint, long, ulong),如下所述:
关于c# - 为什么编译器不喜欢隐式转换为 uint?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/860863/