首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中有符号运算与无符号运算的比较

C语言中有符号运算与无符号运算的比较
EN

Stack Overflow用户
提问于 2011-03-05 11:37:35
回答 4查看 4K关注 0票数 9

非常简单的问题:

我有一个程序在整数和长整型上做了很多很多的数学计算。为了适应额外的情况,我将长整型变量设为无符号的,因为我只处理正数,并且现在可以获得更多的值。

奇怪的是,这给了我15%的性能提升,我确认这是在简单地使所有的long long's unsigned。

这个是可能的吗?对于无符号数字,数学运算真的更快吗?我记得读过文章说没有区别,编译器会自动挑选出最快的方法,不管是带签名的还是未签名的。这15%的提升真的是因为使var没有签名,或者它可能是我的代码中的其他影响因素?

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

EN

回答 4

Stack Overflow用户

发布于 2011-03-05 11:45:20

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

  • 在C中,带符号的整数运算可以被认为是不换行的。例如,编译器将利用这一点进行循环优化。类似地,可以对比较进行优化。(如果你没有预料到这一点,这也可能导致细微的错误)。
  • 另一方面,无符号整数没有这个假设。然而,对于一些操作来说,不必处理符号是一个很大的优势,例如:除法。无符号除以2的恒定幂是一个简单的移位,但是(取决于您的舍入规则)对于负数,有一个条件为-1。

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

你可能会看到long long的效果被放大了,在你的例子中(我猜)是64位。CPU通常没有单独的指令来处理这些类型(在32位模式下),所以稍微增加有符号操作的复杂性将更加明显。

票数 12
EN

Stack Overflow用户

发布于 2011-03-05 11:44:07

在32位处理器上,模拟64位整数操作;使用unsigned而不是signed意味着模拟库不必做额外的工作来传播进位位等。

票数 2
EN

Stack Overflow用户

发布于 2011-03-22 01:25:27

在三种情况下,编译器关心变量是有符号的还是无符号的:

  1. 当变量转换为较长类型时,比较运算符(大于等)
  2. 在可能发生溢出时应用于

在一些机器上,将有符号变量转换为更长的类型需要额外的代码;在其他机器上,转换可能是作为“加载”或“移动”指令的一部分来执行的。

一些机器(主要是小型嵌入式微控制器)需要更多的指令来执行有符号与有符号的比较,而不是无符号与无符号的比较,但大多数机器都有完整的有符号和无符号比较指令。

当无符号类型发生溢出时,编译器可能必须添加代码以确保定义的行为实际发生。签名类型不需要这样的代码,因为在没有这样的代码的情况下可能发生的任何事情都是标准允许的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5201489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档