gpt4 book ai didi

c++ - __int128 @ 最小负值的 UDL(用户定义文字)整数溢出

转载 作者:可可西里 更新时间:2023-11-01 18:35:44 27 4
gpt4 key购买 nike

为了清楚和简单起见,我将缩短以下数字:

  • −170,141,183,460,469,231,731,687,303,715,884,105,728-170…728
  • 170,141,183,460,469,231,731,687,303,715,884,105,727170…727

这些数字表示 128 位有符号整数(gcc 中的 __int128)的最小值和最大值。

我为这种数据类型实现了用户定义的文字(原始文字),因为 gcc 不提供定义这种类型常量的方法:_u128 for unsigned __int128_i128__int128

减号不是 UDL 的一部分,而是应用于 UDL 结果的一元减号运算符。

因此对于 -ddddd_i128(其中 d 是一个数字)UDL 计算一个 signed __int128正值 dddd 然后编译器将对其应用一元减号运算符。到目前为止一切顺利。

问题出在 -170…128_i128(它应该是 __int128 的有效值):
UDL 计算 signed __int128 正数 170…128 刚好超出 __int128 的范围,结果在未定义行为中(有符号整数溢出)。

有什么解决方案可以用 UDL 表示这个数字常量吗?


我的 UDL 已声明(目前只是一个非 constexpr,loopy 版本)(它们是原始文字):

unsigned __int128 operator"" _u128(char const *str);
__int128 operator"" _i128(char const *str);

一些用法:

  1000000000000000000000000000000000_i128
-1000000000000000000000000000000000_i128
-170141183460469231731687303715884105728_i128 // <-- this has UB
170141183460469231731687303715884105727_u128
340282366920938463463374607431768211455_u128

我知道有多种方法可以用各种方式定义常量 -170…728,例如位移、数学运算,但我希望能够以一致的方式创建它,例如我不希望出现这种情况:您可以使用此 UDL 创建任何常量,-170…728_i128 除外,为此您必须使用额外的技巧。

最佳答案

这基本上与实现者在实现 <limits.h> 时遇到的问题相同: INT_MIN不能定义(在典型的 32 位系统上)为 -2147483648 .它可以(通常是)定义为 (-2147483647 - 1)反而。你必须做类似的事情。可能没有任何方法可以用一个否定运算符和文字来表示最大的负数,但这没关系:根本不需要它。

关于c++ - __int128 @ 最小负值的 UDL(用户定义文字)整数溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25143372/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com