相关疑难解决方法(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万
查看次数

有没有理由使用运行时断言而不是编译时断言?

在查看Visual C++代码库时,我发现了以下奇怪的事情.在编译时可以评估条件的情况下,使用运行时断言(检查条件并在违反条件时抛出异常):

assert( sizeof( SomeType ) == sizeof( SomeOtherType ) );
Run Code Online (Sandbox Code Playgroud)

很明显,编译器将评估条件并替换有效的代码

assert( true );
Run Code Online (Sandbox Code Playgroud)

什么都不做或

assert( false );
Run Code Online (Sandbox Code Playgroud)

每次控件通过该行时都会抛出异常.

IMO应该使用编译时断言,原因如下:

  • 它会在编译时更早地暴露条件违规 - 和
  • 它会让清洁(因此更快,更小)的机器代码被发出

看起来像编译时断言是唯一正确的事情.有没有可能的理由在这里更喜欢运行时断言?

c++ assert error-checking visual-c++

5
推荐指数
1
解决办法
4582
查看次数

标签 统计

c++ ×2

assert ×1

c ×1

error-checking ×1

integer-overflow ×1

visual-c++ ×1