![]() |
1
23
我不能给你理由,但我可以从编译器必须遵循的规则(这可能不是你真正感兴趣的知识)的角度来解释为什么编译器有这种行为。 从C规范的旧版本(我可能会下载一个更新的版本)中,Emphasis补充道:
所以,基本上操作数小于
我说我不能给你一个理由;但是,我会猜一个——我认为C的设计者想要确保如果缩小的话可能会丢失信息的操作需要由程序员以强制转换的形式显式的缩小操作。例如:
虽然在两个字节操作数之间执行异或操作时不会发生这种截断,但我认为语言设计者可能不希望有一组更复杂的规则,其中一些操作需要显式的强制转换,而另一些则不需要。
只是一个小提示:上面的引用是“信息性的”而不是“规范性的”,但是它以易于阅读的形式涵盖了所有的案例。严格来说(在规范意义上),原因是
因此,正如信息文本所解释的,操作数被提升为
|
![]() |
2
2
微软的半神程序员有一个答案: http://blogs.msdn.com/oldnewthing/archive/2004/03/10/87247.aspx 也许这更多的是关于编译器的设计。它们通过归纳编译过程使编译器更简单,它不必查看操作数的运算符,因此它将位操作集中在与算术运算符相同的类别中。因此,在类型加宽的情况下 |
![]() |
3
1
我猜是因为操作符xor是为布尔值和整数定义的。 将整数结果转换为字节的结果是一种信息丢失转换,因此需要显式转换(程序员的nod)。 |
![]() |
4
0
这与cli规范中有关隐式和显式强制转换的规则有关。整数(int=system.int32=4字节)比字节(显然是1字节)宽。因此,从int到byte的任何转换都可能是一个收缩转换。因此,编译器希望您将其显式化。 |
![]() |
5
0
我想我记得一个关于这个的流行问题。 |
![]() |
6
0
这似乎是因为在C语言规范中,它是为整型和长型定义的 http://msdn.microsoft.com/en-us/library/aa691307%28v=VS.71%29.aspx 因此,实际发生的情况是编译器将字节操作数隐式地强制转换为int,因为这样不会丢失数据。但如果不丢失数据(隐式地),则无法向下转换结果(int)。所以,您需要明确地告诉编译器您知道自己在做什么! |
![]() |
7
0
为什么两个字节必须转换成整数才能执行XOR? 如果您想深入研究它,cli规范(分区i)的12.1.2描述了这样一个事实:在评估堆栈上,只能存在int或long。在评估过程中,所有较短的积分类型都必须扩展。 不幸的是,我找不到直接指向cli规范的合适链接-我有一个本地的PDF副本,但不记得从哪里得到的。 |
![]() |
8
-1
FWW 字节A=25; 字节B=60; a= a^ b; 不起作用。然而 字节A=25; 字节B=60; a^=B; 工作。 |
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |