我总是假设当执行(a%256)
时,优化器自然会使用有效的按位操作,就像我写了(a
在编译器浏览器gcc-6.2(-O3)上测试时:
// Type your code here, or load an example.
int mod(int num) {
return num % 256;
}
mod(int):
mov edx, edi
sar edx, 31
shr edx, 24
lea eax, [rdi+rdx]
movzx eax, al
sub eax, edx
ret
在尝试其他代码时:
// Type your code here, or load an example.
int mod(int num) {
return num & 0xFF;
}
mod(int):
movzx eax, dil
ret
好像我完全错过了什么。有什么想法吗?
从C 11开始,如果num
为负值,则num%256
必须为非正值。
因此,位模式将取决于系统上有符号类型的实现:对于负的第一个参数,结果不是最低有效8位的提取。
如果在你的例子中num
是unsigned
,那将是另一回事:现在我几乎希望编译器能像你所引用的那样进行优化。
-1%256
产生-1
而不是255
,后者是-1
C有
(a/b)*b a%b==a
的约定,这似乎很自然。a/b
总是返回不含小数部分的算术结果(截断到0)。因此,a%b
具有与a
相同的符号或为0。
除法
-1/256
产生0
,因此-1%6
必须是-1
,才能满足上述条件((-1%6)*256-1%6==-1
)。这与-1明显不同
自N4606起,C标准[expr.mul§4]中的相关章节规定:
对于整数操作数,
/
运算符生成代数商,并丢弃任何小数部分;如果商a/b
可在结果类型中表示,(a/b)*b a%b
等于a
[…]。
但是,使用
无符号
类型,优化将完全正确,满足上述约定:
unsigned(-1)%256 == 0xFF
另见此。
这在不同的编程语言中处理非常不同,因为你可以在维基百科上查找。
不一样。尝试num=-79
,您将从两个操作中得到不同的结果<代码>(-79)%256=-79,而(-79)
使用
unsigned int
,操作相同,代码也可能相同。
有人评论道
它们不应该相同,
a%b
被定义为a-b*floor(a/b)
。
在C、C、Object-C(即问题中的代码将编译的所有语言)中,它不是这样定义的。
我尝试了一些代码在Java中交换两个整数,而不使用第三个变量,即使用XOR。 以下是我尝试的两个交换函数: 该代码产生的输出如下: 我很想知道,为什么会有这样的说法: 和这个不一样?
问题内容: 为什么以下两个语句的结果不同? 编辑: 我应该补充一点,我怀疑将“ 0”第一条语句强制转换为要比较的布尔值-这应该与“‘0’== true”完全相同,显然这是不正确的。 问题答案: 首先,为了完整性: 是的,因为是一个非空字符串,这始终计算结果为: 字符串:如果参数为空字符串(其长度为零),则结果为 false; 否则为 false 。否则结果为 true 。 现在到。 这里将进行两次
问题内容: 我尝试了一些代码,使用XOR在Java中交换两个整数而不使用第三个变量。 这是我尝试的两个交换函数: 这段代码产生的输出是这样的: 我很好奇,为什么这样说: 与这个不同吗? 问题答案: 问题是评估的顺序: 参见JLS第15.26.2节 首先,对左操作数求值以产生一个变量。 如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;右边的操作数不会被评估,并且不会发生赋值。 否则,将保存
然而,今天我在处理一些代码时,意外地发现以下两个交换给出了不同的结果: 这让我难以置信。有人能给我解释一下这里发生了什么吗?
本文向大家介绍浅析为什么a="abc" 不等于 a=new String("abc"),包括了浅析为什么a="abc" 不等于 a=new String("abc")的使用技巧和注意事项,需要的朋友参考一下 显而易见 但是为什么呢?看了很多书,问了好几个大神,其实自己还是稀里糊涂的。这里记录一下,备查。 在js中,区分原始资料类型和包装类型。数字、字符串、布尔、null、undefined 属于原
问题内容: 如果我尝试这样做: 我得到以下输出: 演示:http://codepad.org/ncVuJtJu 这是为什么? 我希望将其作为输出: 我的理解: 但是为什么不输出呢? 问题答案: 所有解释为什么得到2而不是1的答案实际上都是错误的。根据PHP文档,混合并以这种方式是不确定的行为,所以你可以得到1或2切换到不同版本的PHP可能会改变你得到的结果,这将是一样有效。 请参阅示例1,其中显示