![]() |
1
32
令人惊讶的是,当您对字节执行操作时,计算将使用
第二个代码段等效于:
正因为如此,你必须把结果放回原处
|
![]() |
2
11
下面是CLI规范(Ecma 335)中的一个表的副本,该表指定了哪些操作数对类型为a op B的二进制数字运算符有效,其中a和B是操作数,“op”是运算符,如操作码.Sub在代码段中使用的:
这需要一些注释:
请注意的行和列 F级 与您的问题相关:还要注意byte、sbyte、char、short和ushort类型不存在。同样的方法,编译器将操作数转换为可以表示值的最小类型,以便可以使用运算符。是int32。根据表,操作的结果将是int32。 现在问题来了:结果是int32,但是将其赋回到字节值需要一个缩小的转换。从32位到8位。这是个麻烦,因为它会丢失大量的比特。C编译器要求您将其显式化。你基本上承认你知道你在做什么,并且你意识到潜在的令人惊讶的结果。就像这个:
-=运算符是一个问题,因为没有有效的方法应用所需的强制转换。它在语言语法中是不可表达的。使用(byte)3是没有意义的,文本会被转换成int32以使操作符工作。 他们解决了这个问题,编译器在没有你帮助的情况下自动发出强制转换。 |
![]() |
Bfyuvf · 直接输入二进制可能的C++[重复] 3 年前 |
![]() |
Rado Harutyunyan · 在缓冲区节点中写入位 7 年前 |
![]() |
zaozaoer · >>java中带负字节值的and>>>运算符 7 年前 |
![]() |
rubyquartz · 交换无符号短整数的字节 7 年前 |
![]() |
DenoDev · C-十六进制输出中缺少0 7 年前 |