gpt4 book ai didi

c++ - 哪种方法可以测试乘法有符号整数溢出?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:04 25 4
gpt4 key购买 nike

以下哪一项以符合标准的方式“正确地做事”?您可以假设 mnint(有符号整数)类型。主要问题是有符号整数溢出。

示例 1。

size_t bytes = n * m;
if (n > 0 && m > 0 && SIZE_MAX/n >= m) {
/* allocate “bytes” space */
}

示例 2。

if (n > 0 && m > 0 && SIZE_MAX/n >= m) {
size_t bytes = n * m;
/* allocate “bytes” space */
}

示例 3。

if (n > 0 && m > 0 && SIZE_MAX/n >= m) {
size_t bytes = (size_t)n * (size_t)m;
/* allocate “bytes” space */
}

我认为他们都错了,但并非出于同样的原因。那么什么是正确的呢?

这些片段摘自 here .


编辑以强调主要问题是乘以有符号整数,这可能导致未定义的行为(无符号不会)。

我现在认为,只要整数、有符号整数、size_t 和 SIZE_MAX 具有“通常”值,或者至少它们符合相关标准,我现在认为最后一个样本可以正常工作。

最佳答案

1 和 2 是错误的,因为 n * m 可能会溢出。事实上,您继续将其分配给 size_t 并不会“逆转”溢出。

我认为 3 是正确的。 (顺便说一句,m 上的转换是多余的)。如果有人不同意,请发布使测试不正确的 mnSIZE_MAX 的示例值!

我也看不出问题:

if ( m > 0 && n > 0 && (size_t)m * n / n == m )
size_t bytes = (size_t)m * n;

关于c++ - 哪种方法可以测试乘法有符号整数溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23166648/

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