【发布时间】:2017-06-03 14:22:55
【问题描述】:
我会用 Python 做例子,因为我使用 Python,但问题不在于 Python。 假设我想按特定值递增变量,使其保持在给定的边界内。
所以对于递增和递减,我有这两个函数:
def up (a, s, Bmax):
r = a + s
if r > Bmax : return Bmax
else : return r
def down (a, s, Bmin):
r = a - s
if r < Bmin : return Bmin
else : return r
注意:假设变量“a”的初始值已经在边界内(min
问题是:
- 那些被归类为一些典型的操作并且它们有具体的名字吗?
- 如果是,是否与内在处理器功能有一些对应关系,因此在某些编译器中进行了优化?
我问的原因纯属好奇,当然我无法用 Python 优化它,而且我对 CPU 架构知之甚少。
更具体地说,在较低级别上,对于无符号 8 位整数,我想增量看起来像这样:
def up (a, s, Bmax):
counter = 0
while True:
if counter == s : break
if a == Bmax : break
if a == 255 : break
a += 1
counter += 1
我知道后者在 Python 中没有任何意义,所以把它当作我天真的尝试想象低级代码增加了价值。有一些细微差别,例如有符号、无符号,但我只对无符号整数感兴趣,因为我经常遇到它。
【问题讨论】:
-
有趣的问题,让我深挖,仍然找不到确切的答案。在 ptgmedia.pearsoncmg.com/images/0321335724/samplechapter/… 中,第 170 页向内讨论了如何使用 IA-32 指令(jc 和 inc)检测溢出。使用 GCC,您可以使用 -ftrapv 发出 SIGABRT 并注册处理程序并解决溢出问题。
-
我明白你的问题,但为了清楚起见,你无法检测加法的结果是否大于它可以用你编写 UP 函数的方式表示的最大值。考虑一个有符号整数,如果您的当前值为 0x7FFFFFFE,比 MAX 小 1,并且您想加 2,它将溢出并导致 -2,147,483,648 小于它可以表示的最大值。所以你永远不会看到你的 UP 函数返回 MAX
标签: compilation cpu-architecture intrinsics