gpt4 book ai didi

c - C 中的有符号与无符号运算

转载 作者:太空狗 更新时间:2023-10-29 16:52:24 24 4
gpt4 key购买 nike

非常简单的问题:

我有一个程序对 int 和 long long 进行大量数学计算。为了增加一点,我将 long long 设为无符号,因为我只处理正数,现在可以获得更多的值。

奇怪的是,这给了我 15% 的性能提升,我确认这是因为简单地将所有 long long 设为无符号。

这可能吗?无符号数的数学运算真的更快吗?我记得读过没有区别,编译器会自动选择最快的方式去签名或未签名。这 15% 的提升真的是因为使变量无符号,还是我的代码中有其他影响?

而且,如果真的是让变量无符号,我是否应该让所有东西(甚至整数)都无符号,因为我从不需要负数,如果我能保存每一秒,每一秒都很重要。

最佳答案

在某些操作中,有符号整数更快,而在其他操作中,无符号整数更快:

  • 在 C 语言中,可以假设有符号整数运算不换行。例如,编译器将在循环优化中利用这一点。可以类似地优化比较。 (如果您没有预料到这一点,这也可能导致细微的错误)。

  • 另一方面,无符号整数没有这个假设。然而,不必处理符号对于某些操作来说是一个很大的优势,例如:除法。无符号除以 2 的常数次幂是一个简单的移位,但是(取决于您的舍入规则)负数有一个有条件的 off-by-1。

就我个人而言,我养成了只使用无符号整数的习惯,除非我真的、真的有一个需要签名的值。与其说是性能,不如说是正确性。

您可能会看到 long long 放大的效果,(我猜)在您的情况下是 64 位。 CPU 通常没有处理这些类型的单一指令(在 32 位模式下),因此有符号操作稍微增加的复杂性会更加明显。

关于c - C 中的有符号与无符号运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5201489/

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