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

哪个是IEEE 754浮点数无法准确表示的第一个整数?

为清楚起见,如果我使用的是实现IEE 754浮点数的语言,我声明:

float f0 = 0.f;
float f1 = 1.f;
Run Code Online (Sandbox Code Playgroud)

...然后将它们打印出来,我会得到0.0000和1.0000 - 完全正确.

但IEEE 754无法表示实线上的所有数字.接近于零,"差距"很小; 当你越走越远时,差距越来越大.

所以,我的问题是:对于一个IEEE 754浮点数,这是第一个(最接近零)整数,无法准确表示?我现在只关心32位浮点数,虽然如果有人给出它我会有兴趣听到64位的答案!

我认为这就像计算2 bits_of_mantissa并添加1 一样简单,其中bits_of_mantissa是标准公开的位数.我在我的机器(MSVC++,Win64)上为32位浮点数做了这个,但它看起来很好.

floating-point types ieee-754

152
推荐指数
2
解决办法
3万
查看次数

从C程序读取标志寄存器

为了好奇,我试图读取标志寄存器并以一种很好的方式将其打印出来.

我已经尝试使用gcc的asm关键字阅读它,但我无法让它工作.任何提示如何做到这一点?我正在运行Intel Core 2 Duo和Mac OS X.以下代码就是我所拥有的.我希望能告诉我是否发生溢出:

#include <stdio.h>

int main (void){
  int a=10, b=0, bold=0;
  printf("%d\n",b);
  while(1){
    a++;
  __asm__ ("pushf\n\t"
   "movl 4(%%esp), %%eax\n\t"
   "movl %%eax , %0\n\t"
   :"=r"(b)      
   :         
   :"%eax"        
   ); 
  if(b!=bold){ 
    printf("register changed \n %d\t to\t %d",bold , b);
  }
  bold = b;
  }
}
Run Code Online (Sandbox Code Playgroud)

这给出了分段错误.当我运行gdb时,我得到了这个:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x000000005fbfee5c
0x0000000100000eaf in main () at asm.c:9
9       asm ("pushf \n\t"
Run Code Online (Sandbox Code Playgroud)

c x86 assembly flags

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

标签 统计

c ×2

assembly ×1

c++ ×1

flags ×1

floating-point ×1

ieee-754 ×1

integer-overflow ×1

types ×1

x86 ×1