我只想知道在C/C++中哪个操作更快,以及类型转换的计算复杂度是多少。
将x键入无符号整数,如下所示:

(unsigned int) x


在x和常数之间进行比较:
x<0

编辑:计算复杂度,在该过程中,需要在硬件的低级方面进行最少的位操作,以便成功地执行指令。
编辑2:所以要给出一些上下文,我特别想做的是看看
if( x < 0)

进入之内
if((((unsigned int)x)>>(((sizeof(int))<<3)-1)))

如果超过100000000次,对于x,大于/小于(+/-)50000000的大数量,是否更有效

最佳答案

(unsigned int) x是-对于近乎通用的2的补码表示法-编译时操作:告诉编译器将x的内容视为一个unsigned值,它本身不需要任何运行时机器代码指令,但可以更改它发出的机器代码指令,以支持使用unsigned值,或者甚至导致死代码消除优化,例如,在转换之后,可以完全消除以下情况:

if ((unsigned int)my_unsigned_int >= 0)

相关的C++标准引用(我的BurdFur饰面):
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)。[注:在二中
补码表示,这种转换是概念性的,位模式没有变化(如果没有截断)。-尾注]
可能存在实际的按位变化,需要使用1的补码或符号/幅度表示在某些奇怪的硬件上进行操作。(感谢Yuushi在评论中强调这一点)。
这与x < 0相反,对于编译器没有特殊知识的带符号的x,它确实需要CPU/机器代码指令来计算(如果使用了结果)和相应的运行时。这种比较指令在更老的CPU上往往需要1个“周期”,但请记住,现代CPU管道可以在一个周期内并行执行许多这样的指令。
if( x < 0)vsif((((unsigned int)x)>>(((sizeof(int))<<3)-1)))-更快?
第一个总是至少和第二个一样快。与零的比较是CPU的一个简单的操作,C++编译器一定会使用一个高效的操作码(机器代码指令):你在浪费时间去改进它。

关于c++ - 将int转换为unsigned的计算复杂度与比较值的复杂度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35053625/

10-14 07:29