非常简单的问题:
我有一个程序在整数和长整型上做了很多很多的数学计算。为了适应额外的情况,我将长整型变量设为无符号的,因为我只处理正数,并且现在可以获得更多的值。
奇怪的是,这给了我15%的性能提升,我确认这是在简单地使所有的long long's unsigned。
这个是可能的吗?对于无符号数字,数学运算真的更快吗?我记得读过文章说没有区别,编译器会自动挑选出最快的方法,不管是带签名的还是未签名的。这15%的提升真的是因为使var没有签名,或者它可能是我的代码中的其他影响因素?
而且,如果真的是因为让变量变得无符号,我是否应该让所有东西(即使是整数)都是无符号的,因为我从来不需要负数,如果我能保存它,每一秒都很重要。
发布于 2011-03-05 11:45:20
在某些操作中,有符号整数更快,而在其他操作中,无符号整数更快:
就我个人而言,我养成了只使用无符号整数的习惯,除非我真的真的有需要签名的值。与其说是为了性能,不如说是为了正确性。
你可能会看到long long的效果被放大了,在你的例子中(我猜)是64位。CPU通常没有单独的指令来处理这些类型(在32位模式下),所以稍微增加有符号操作的复杂性将更加明显。
发布于 2011-03-05 11:44:07
在32位处理器上,模拟64位整数操作;使用unsigned而不是signed意味着模拟库不必做额外的工作来传播进位位等。
发布于 2011-03-22 01:25:27
在三种情况下,编译器关心变量是有符号的还是无符号的:
在一些机器上,将有符号变量转换为更长的类型需要额外的代码;在其他机器上,转换可能是作为“加载”或“移动”指令的一部分来执行的。
一些机器(主要是小型嵌入式微控制器)需要更多的指令来执行有符号与有符号的比较,而不是无符号与无符号的比较,但大多数机器都有完整的有符号和无符号比较指令。
当无符号类型发生溢出时,编译器可能必须添加代码以确保定义的行为实际发生。签名类型不需要这样的代码,因为在没有这样的代码的情况下可能发生的任何事情都是标准允许的。
https://stackoverflow.com/questions/5201489
复制相似问题