加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 23:52:14 所属栏目:百科 来源:网络整理
导读:我在C和C#中遇到了关于uint使用的几个类似的怪癖,现在我想知道推理(对于每个例子可能完全不同).对于这两个示例,请注意我正在编译时将警告级别设置为最大值. (1)gcc抱怨在下面比较int和uint,而vc没有: uint foo = somevalue;if( foo == ~0 ) //right here ..
我在C和C#中遇到了关于uint使用的几个类似的怪癖,现在我想知道推理(对于每个例子可能完全不同).对于这两个示例,请注意我正在编译时将警告级别设置为最大值.

(1)gcc抱怨在下面比较int和uint,而vc没有:

uint foo = <somevalue>;
if( foo == ~0 )  //right here
   ...

比较0就可以了,没有在gcc和vc上进行任何转换.

(2)在C#3.5中,我遇到了一个类似的问题.以下工作正常:

uint foo = 1;
uint bar = 2;

但这会给出一个uint / int警告:

bool condition = <somevalue>;
uint foo = condition ? 1 : 2; //right here

是什么给出了,为什么编译器对立即值的签名如此敏感?我完全理解从变量赋值时的问题,但这对我来说对于直接值是没有意义的;在解析中是否存在一些隐藏的难以阻止此行为被允许?或者是什么?

编辑:是的,我知道我可以用’你’来填充我的数字,但是这可以回避我的问题,即隐含地向左侧投射,而不是明确地施放右侧.

解决方法

我不能说gcc,但对于C#3编译器,你需要明确地告诉它这些int应该是无符号的:

uint foo = condition ? 1U : 2U;

C#编译器喜欢整数并假设范围内的所有整数值都是整数.由于您的表达式使用条件运算符,编译器太急于假设您的文字值是整数,然后分配失败.

编辑:请注意,我说的是System.Int32范围内的整数值.考虑这个例子:

using System;    

class Program    
{    
    static void Main()    
    {    
        Console.WriteLine(1.GetType());    
        Console.WriteLine(2147483648.GetType());    
    }    
}

输出:

System.Int32
System.UInt32

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读