栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何检测无符号整数乘法溢出?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何检测无符号整数乘法溢出?

Clang 3.4+和GCC 5+提供了经过检查的算术内置函数。它们提供了一个非常快速的解决方案,特别是与位测试安全检查相比。

对于OP问题中的示例,它将像这样工作:

unsigned long b, c, c_test;if (__builtin_umull_overflow(b, c, &c_test)){    // Returned non-zero: there has been an overflow}else{    // Return zero: there hasn't been an overflow}

Clang文档没有指定

c_test
如果发生溢出是否包含溢出结果,但是GCC文档说确实包含。鉴于这两个都喜欢
__builtin
兼容,因此可以安全地假设这也是Clang的工作方式。

有一个

__builtin
对每个运算,可以溢出(加法,减法,乘法),用符号和无符号的变体,对于int尺寸,长尺寸,以及长长的大小。名称的语法为
__builtin_[us](operation)(l?l?)_overflow

  • u对于未签名或s对签名的 ;
  • 操作中的一个add,sub或mul;
  • 没有l后缀表示操作数是ints;一种l手段long; 2 l的平均值long long。

因此,对于一个选中的带符号长整数加法运算,它将为

__builtin_saddl_overflow
。完整列表可在Clang文档页面上找到。

GCC 5+和锵3.8+还提供通用内建的工作,而无需指定值的类型:__builtin_add_overflow,

__builtin_sub_overflow
__builtin_mul_overflow
。这些也适用于小于的类型int。

内建工具降低到最适合该平台的水平。在x86上,它们检查进位,溢出和符号标志。

Visual Studio
cl.exe
没有直接等效项。对于无符号的加法和减法,包括将允许您使用
`addcarry_uNN
subborrow_uNN
(其中NN是位数,例如
addcarry_u8
或`subborrow_u64)。他们的签名有点晦涩:

unsigned char _addcarry_u32(unsigned char c_in, unsigned int src1, unsigned int src2, unsigned int *sum);unsigned char _subborrow_u32(unsigned char b_in, unsigned int src1, unsigned int src2, unsigned int *diff);

c_in
/
b_in
是输入上的进位/借位标志,返回值是输出上的进位/借位。它似乎没有等效的有符号运算或乘法。

否则,适用于Windows的Clang现在可以投入生产了(对于Chrome来说已经足够了),因此也可以选择。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/366291.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号