相关疑难解决方法(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中的有符号整数溢出?

有(1):

// assume x,y are non-negative
if(x > max - y) error;
Run Code Online (Sandbox Code Playgroud)

并且(2):

// assume x,y are non-negative
int sum = x + y;
if(sum < x || sum < y) error;
Run Code Online (Sandbox Code Playgroud)

哪个是首选或有更好的方法.

c integer-overflow

26
推荐指数
3
解决办法
6万
查看次数

如何在C中将unsigned int转换或转换为int?

如果问题看起来很奇怪,我道歉.我正在调试我的代码,这似乎是问题,但我不确定.

谢谢!

c int unsigned types casting

16
推荐指数
3
解决办法
10万
查看次数

无符号整数的差异-标准的支持方式来获得有符号结果?

假设有两个任意时间戳记:

uint32_t timestamp1;    
uint32_t timestamp2;
Run Code Online (Sandbox Code Playgroud)

除了转换为更大的带符号类型的明显变体和相当冗长的if-else之外,是否有一种标准的一致方式来获得两者的带符号区别。

事先不知道哪一个较大,但是已知差异不大于最大20位,因此它将适合32位带符号。

int32_t difference = (int32_t)( (int64_t)timestamp1 - (int64_t)timestamp2 );
Run Code Online (Sandbox Code Playgroud)

该变体的缺点是硬件可能不支持使用64位算术,并且只有存在较大的类型时(当然,时间戳已经是64位),这当然是可能的。

其他版本

int32_t difference;
if (timestamp1 > timestamp2) {
  difference =    (int32_t)(timestamp1 - timestamp2);
} else {
  difference = - ((int32_t)(timestamp2 - timestamp1));
}
Run Code Online (Sandbox Code Playgroud)

非常冗长,涉及条件跳转。

那是

int32_t difference = (int32_t)(timestamp1 - timestamp2);
Run Code Online (Sandbox Code Playgroud)

从标准的角度来看,这是否可以保证正常工作?

c language-lawyer

13
推荐指数
1
解决办法
209
查看次数

标签 统计

c ×4

integer-overflow ×2

c++ ×1

casting ×1

int ×1

language-lawyer ×1

types ×1

unsigned ×1