c/c++语言开发共享为什么stdlib.h的abs()系列函数返回有符号值?

手册中注明了这种负面含义:

注意未定义尝试取最负整数的绝对值。

这背后的原因是什么?对于想要避免未定义行为的人来说,最好的办法是什么? 我是否必须采取以下措施:

unsigned uabs(signed val) { return val > 0 ? val : (val == 1U << ((sizeof(val) * 8) - 1)) ? -1U : -val; } 

(故意hacky强调对stdlib的不满;-)

假设您有一个4位有符号值(为了便于理解)。 unsigned max是15,signed(正)max是7,signed(负)min是-8,所以abs(-8)不适合有符号值。 当然,您可以将其表示为-8,但随后对结果进行除法和乘法不会按预期工作。

    这个问题的真正答案在于类型提升规则。

    如果我将算术运算符应用于unsigned intint ,则int参数将提升为unsigned ,结果也是unsigned

    如果abs()函数返回unsigned ,那么当它在表达式中使用时会导致其他值的这种类型的提升,这会导致意外的结果。 例如,这段代码:

     if (abs(-1) * -1 < 0) printf("< 0n"); else printf(">= 0n"); 

    会打印“> = 0”,这是许多人不愿意的。 无法使用单值INT_MIN可能看起来INT_MIN

    为什么它会使用无符号空格返回一个值?

    让我们考虑8位有符号和无符号数。 如果你有-128,结果是未定义的……我猜stdlib不希望减慢这么多。 如果您认为您可能拥有该范围内的数字,那么您需要使用其他内容。

    如果您认为签免费精选名字大全符中的值可能大于127,那么您就错了。

    因此,值不必保持大于127的值,并且保持签名不会丢失。 如果你想将它转换为无符号,请继续。 因为它曾经是一个有符号整数,所以你再次进行签名数学的几率很高。 就我个人而言,我认为我更喜欢这种类型保持签名,因为我真的很想要处理无符号并且我没有做位操作。

    但也许其他人可以从标准委员会那里挖掘一些笔记。

    需要了解更多c/c++开发分享为什么stdlib.h的abs()系列函数返回有符号值?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享为什么stdlib.h的abs()系列函数返回有符号值?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      www.ctvol.com true Article c/c++语言开发共享为什么stdlib.h的abs()系列函数返回有符号值?

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979147.html

      (0)
      上一篇 2021年12月12日 下午2:24
      下一篇 2021年12月12日 下午2:24

      精彩推荐