在C中签名与未签名操作[英] Signed vs Unsigned operations in C

本文是小编为大家收集整理的关于在C中签名与未签名操作的处理方法,想解了在C中签名与未签名操作的问题怎么解决?在C中签名与未签名操作问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

非常简单的问题:

我有一个程序,对INT和较长的朗进行了许多数学计算.为了额外适合,我将漫长的长符号固定在一起,因为我只处理正数,现在可以得到更多的值.

奇怪的是,这给了我15%的性能提升,我确认这就是简单地使所有长期的未签名.

这可能吗?数学操作的速度是否更快,没有签名数字?我记得读到没有区别,编译器会自动挑选出最快的方法,无论是签名还是未签名.这是15%的提升是真的通过使VAR未签名,还是在我的代码中受到其他影响?

,如果这确实是因为使VAR未签名,我是否应该打算使所有内容(甚至是Ints)无签名,因为我永远不需要负数,如果我可以保存它,那么每一秒都很重要.

推荐答案

在某些操作中,签名的整数更快,在其他操作中,未签名更快:

  • 在C中,可以假定签名的整数操作不包裹.例如,编译器将在循环优化中利用这一点.比较可以类似地优化. (如果您不希望这样做,这也可能导致细微的错误).

  • 另一方面,未签名的整数没有此假设.但是,不必处理标志对于某些操作来说是一个很大的优势,例如:分裂.通过两个恒定的幂分配是一个简单的转变,但是(取决于您的舍入规则)负数有条件的偏外数.

就个人而言,我养成了仅使用未签名的整数,除非我真的确实有一个需要签名的价值.

的性能并不是那么多.

您可能会看到长长的效果会放大,这(我猜想)在您的情况下为64位. CPU通常没有单个说明确实处理了这些类型(以32位模式),因此签名操作的略有增加的复杂性将更加明显.

其他推荐答案

在32位处理器上模拟了64位整数操作;使用unsigned而不是signed意味着仿真库不必做额外的工作即可传播携带位等.

其他推荐答案

在三种情况下,编译器关心变量是签名还是未签名:

  1. 当变量转换为更长的类型时
  2. 应用比较操作员(比大于大)
  3. 何时发生溢出

在某些机器上,将签名变量转换为更长的类型需要额外的代码;在其他机器上,可以作为"负载"或"移动"指令的一部分进行转换.

某些机器(主要是小型嵌入式微控制器)需要更多的说明来执行签名的与未签名的比较进行签名,但大多数机器都具有签名和无签名的比较说明.

当无符号类型发生溢出时,编译器可能必须添加代码以确保确定的行为实际发生.签名类型不需要此类代码,因为标准允许.

本文地址:https://www.itbaoku.cn/post/359210.html