C#数字常数

时间:2020-03-05 18:47:26  来源:igfitidea点击:

我有以下Ccode:

byte rule = 0;
...
rule = rule | 0x80;

产生错误:

Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?)

[更新:问题的第一个版本是错误的...我看错了编译器的输出]

添加演员表不能解决问题:

rule = rule | (byte) 0x80;

我需要这样写:

rule |= 0x80;

看起来好像很奇怪。为什么| =运算符与|运算符有什么不同?

还有其他方法可以告诉编译器将该常量视为一个字节吗?

// @乔瓦尼·加尔博(Giovanni Galbo):是和否。该代码处理外部设备中闪存的编程,并在逻辑上表示存储器的单个字节。我可以稍后再投放,但这似乎更加明显。我想我的C语言遗产展示得太多了!

@ Jonathon Holland:'as'语法看起来更整洁,但不幸的是似乎不起作用...它产生:

The as operator must be used with a reference type or nullable type ('byte' is a non-nullable value type)

解决方案

回答

看起来我们可能只需要这样做就很丑陋:http://msdn.microsoft.com/en-us/library/5bdb6693.aspx。

回答

C没有字节的字面后缀。 u = uint,l = long,ul = ulong,f = float,m =十进制,但无字节。你必须投下它。

回答

我们要查找的术语是"字面量",不幸的是Ces没有字节字面量。

这是所有文人的清单。

回答

根据ECMA规范,第72页没有字节字面量。类型仅是整数文字:int,uint,long和ulong。

回答

不幸的是,我们唯一的办法就是按照自己的方式去做。没有后缀可以将文字标记为字节。的|运算符未提供隐式转换,就像赋值(即初始化)那样。

回答

这有效:

rule = (byte)(rule | 0x80);

显然,"规则|即使将0x80定义为"常量字节0x80"," 0x80"也将返回int。

回答

int rule = 0;
rule |= 0x80;

http://msdn.microsoft.com/zh-cn/library/kxszd0kx.aspx为所有值类型定义了运算符。我认为这将产生预期的结果。 " | ="运算符是一个或者然后分配的运算符,它只是rule = rule |的简写形式。 0x80。

关于Cis的最巧妙的事情之一是,它使我们能够仅根据其大小来执行疯狂的事情,例如滥用值类型。 " int"与一个字节完全相同,除了如果我们尝试同时使用它们和两者,编译器将引发警告。只需坚持使用一个(在本例中为int)即可。如果我们担心64位就绪状态,可以指定int32,但所有int均为int32,即使在x64模式下运行也是如此。

回答

Apparently the expression 'rule |
  0x80' returns an int even if you
  define 0x80 as 'const byte 0x80'.

我认为规则是像0x80这样的数字默认为int,除非我们包含文字后缀。因此,对于" rule | 0x80`,结果将是一个int值,因为0x80是一个int值,规则(一个字节)可以安全地转换为int值。