我在C++编写一个程序来找到所有的解决方案一b = c ^,其中一个,b和c ^一起使用所有的数字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++中检测带符号的溢出
有(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)
哪个是首选或有更好的方法.
如果问题看起来很奇怪,我道歉.我正在调试我的代码,这似乎是问题,但我不确定.
谢谢!
假设有两个任意时间戳记:
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)
从标准的角度来看,这是否可以保证正常工作?