相关疑难解决方法(0)

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

我在C++编写一个程序来找到所有的解决方案b = c ^,其中一个,bc ^一起使用所有的数字0-9只出现一次.该方案在循环值b,并且在每次跑了数字计数程序,b一个b以检查是否数字的条件感到满意.

然而,当可以产生伪解一个b溢出整数限制.我最终使用以下代码检查:

unsigned long b, c, c_test;
...
c_test=c*b;         // Possible overflow
if (c_test/b != c) {/* There has been an overflow*/}
else c=c_test;      // No overflow
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来测试溢出?我知道有些芯片有一个内部标志,当溢出发生时会设置,但我从未见过通过C或C++访问它.


请注意,在C和C++中,签名 int溢出是未定义的行为,因此您必须在不实际导致它的情况下检测它.有关添加前的signed int overflow,请参阅在C/C++中检测带符号的溢出

c c++ integer-overflow

593
推荐指数
19
解决办法
30万
查看次数

在C++中清除printf size_t的代码(或者:C++中C99的%z的最近等价物)

我有一些C++代码打印出size_t:

size_t a;
printf("%lu", a);
Run Code Online (Sandbox Code Playgroud)

我希望在32位和64位架构上编译时不会发出警告.

如果这是C99,我可以使用printf("%z", a);.但是AFAICT %z在任何标准C++方言中都不存在.所以相反,我必须这样做

printf("%lu", (unsigned long) a);
Run Code Online (Sandbox Code Playgroud)

这真的很难看.

如果没有size_t内置于该语言中的打印功能,我想知道是否可以编写一个printf包装器或类似的东西,这样可以在size_ts 上插入适当的强制转换,以便在保持好的编译器警告的同时消除虚假的编译器警告.

有任何想法吗?


编辑为了澄清为什么我使用printf:我有一个相对较大的代码库,我正在清理.它使用printf包装器来执行诸如"编写警告,将其记录到文件以及可能退出错误的代码"之类的操作.我可能能够用cout包装器来运行足够的C++ - foo,但是我不想改变程序中的每个warn()调用,只是为了摆脱一些编译器警告.

c++ printf size-t

94
推荐指数
7
解决办法
7万
查看次数

是使用无符号整数溢出的好习惯吗?

我前几天正在阅读C标准,并注意到与有符号整数溢出(未定义)不同,无符号整数溢出是明确定义的.我已经看到它在很多代码中用于最大化等等但是考虑到有关溢出的voodo,这被认为是很好的编程习惯吗?无论如何不安全吗?我知道许多像Python这样的现代语言都不支持它 - 相反,它们继续扩展大数字的大小.

c c++

19
推荐指数
2
解决办法
7292
查看次数

UINT_MAX + 1等于什么?

C中定义的行为是UINT_MAX + 1u什么?假设它为零是多么安全?

c standards portability

12
推荐指数
3
解决办法
8672
查看次数

如果使用错误的格式字符串调用printf会发生什么?

或者换句话说:可能错误printf/ fprintf十进制整数(%d,%u,%ld,%lld)格式化字符串导致程序崩溃或导致未定义的行为?

Cosinder以下代码行:

#include <iostream>
#include <cstdio>

int main() {
    std::cout << sizeof(int) << std::endl
              << sizeof(long) << std::endl;

    long a = 10;
    long b = 20;
    std::printf("%d, %d\n", a, b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

32位架构的结果:

4
4
10, 20
Run Code Online (Sandbox Code Playgroud)

64位架构的结果:

4
8
10, 20
Run Code Online (Sandbox Code Playgroud)

在任何情况下,程序都会打印出预期的结果.我知道,如果long值超出int范围,程序会打印错误的数字 - 这很难看,但不影响程序的主要目的 - 但除此之外,是否会发生意外情况?

c++

4
推荐指数
1
解决办法
2344
查看次数

标签 统计

c++ ×4

c ×3

integer-overflow ×1

portability ×1

printf ×1

size-t ×1

standards ×1