我在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',但这回避了我的问题,我的问题是关于将右侧隐含转换为左侧,而不是显式转换右侧。