gpt4 book ai didi

c++ - 无符号数学是否需要更多 CPU 指令?

转载 作者:可可西里 更新时间:2023-11-01 18:41:58 24 4
gpt4 key购买 nike

取一个 C++ 整数变量 i,并假设您将其值乘以 2。

如果 i 有符号,我相信这个操作在某种程度上等价于,至少在数学上,到:

i = i << 1;

但是如果 i 的类型是无符号的,那么由于无符号值不会溢出而是以其范围为模执行,大概操作是这样的:

i = (i << 1) & (decltype(i))-1;

现在,我认为实际的机器指令可能比乘法的移位序列更简洁。但是现代的,比如 x86,CPU 是否有针对无符号/模数学的特定指令?或者,与使用有符号值的数学运算相比,使用无符号值执行数学运算是否会花费额外的指令?

(是的,在编程时关心这个是荒谬的;我出于纯粹的好奇心感兴趣。)

最佳答案

正如其他人已经写的那样:这对 CPU 来说无关紧要。有符号指令和无符号指令花费相同的时间,无符号算术中的一些运算甚至更容易完成,并且可能需要比带符号变体更少的周期(多精度除法就是一个例子)。

然而,这只是故事的一半。

C++ 将有符号整数溢出定义为未定义行为,将无符号整数定义为模 2。这提供了完全不同的优化机会,从而导致不同的代码。

一个例子:

int foo (int a)
{
return a * 1000 / 500;
}

unsigned bar (unsigned a)
{
return a * 1000 / 500;
}

这里 foo 可以优化为:

int foo (int a)
{
return a * 2;
}

bar 会保持原样。

请注意,这两个函数在数学上是相同的,但如果参数超过 INT_MAX/1000,它们将开始给出不同的结果。

由于有符号溢出的影响是未定义的,因此在简化表达式时,编译器可以选择假装没有 INT_MAX。对于无符号算术,情况并非如此,编译器必须发出执行乘法和除法的代码。这当然比优化变体慢。

注意:大多数编译器在进行此类优化时都很保守,只有在您提出要求时才启用它们,因为它们往往会破坏代码和溢出检查。其他编译器,尤其是在嵌入式和 DSP 世界中,即使在低优化级别,otoh 也总是会进行此类优化。为这类机器编写代码的程序员都知道细微的细节,所以这很少成为问题。

OTOH 我们已经讨论过 C/C++ 程序员在 stackoverflow 上不止一次陷入这个陷阱的故事。

关于c++ - 无符号数学是否需要更多 CPU 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6640974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com