c# - 为什么编译器不喜欢隐式转换为 uint?

标签 c# c++ visual-c++ gcc

我在 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# Inger literals - MSDN

关于c# - 为什么编译器不喜欢隐式转换为 uint?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/860863/

相关文章:

c++ - 将成员函数分配给其他函数

c# - 类库能否读取正在执行的编码 UI 测试的 app.config 文件?

c++ - 无法从 Windows 注册表中读取字符串

c# - C#中如何表示4个字节的字符

C++ 代码中的 iPhone/iPad fatal error 在日志中不产生任何输出

c++ - 生成的 protobuf 消息的描述符的生命周期是多少?

c++ - 在动态链接库 kernel32.dll 中找不到过程入口点 RegCloseKey

c++ - 在 C++ 函数中定义的对象在超出范围后是否会被销毁?

c# - SqlCommand.ExecuteScalar 避免空值

c# - 响应式扩展 (rx) 仅使用一个后台线程