当前位置: 首页 > 知识库问答 >
问题:

为什么(a%256)不同于(a

酆高翰
2023-03-14

我总是假设当执行(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

好像我完全错过了什么。有什么想法吗?


共有3个答案

雍马鲁
2023-03-14

从C 11开始,如果num为负值,则num%256必须为非正值。

因此,位模式将取决于系统上有符号类型的实现:对于负的第一个参数,结果不是最低有效8位的提取。

如果在你的例子中numunsigned,那将是另一回事:现在我几乎希望编译器能像你所引用的那样进行优化。

燕昊东
2023-03-14

-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

另见此。

这在不同的编程语言中处理非常不同,因为你可以在维基百科上查找。

钱欣悦
2023-03-14
匿名用户

不一样。尝试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,其中显示