小编Ale*_*nze的帖子

不精确的浮点常量的警告

诸如" 为什么不是0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 = 0.8? "之类的问题让我想到......

...让编译器警告它在二进制浮点类型中舍入到最接近的可表示的浮点常量可能会很好(例如,0.1和0.8在基数-2浮点中舍入,否则它们'需要无限量的空间来存储无数个数字).

我抬头一看gcc的警告,到目前为止,没有发现用于此目的(-Wall,-Wextra,-Wfloat-equal,-Wconversion,-Wcoercion(不支持或仅C?),-Wtraditional(C只)似乎并没有做我想要的).

我还没有在Microsoft Visual C++编译器中发现这样的警告.

我错过了隐藏或很少使用的选项吗?

是否有任何具有此类警告的编译器?

编辑:此警告可用于教育目的,并作为新浮点的提醒.

c c++ floating-point gcc visual-c++

11
推荐指数
1
解决办法
1152
查看次数

Int to Float to Int转换精度损失

最近,我编写了一个小程序,并使用2个不同版本的mingw32(在Windows8上)编译它.令人惊讶的是,我得到了两个不同的结果.我试图解除它,但没有发现什么特别的.谁能帮助我?谢谢.

exe文件:https: //www.dropbox.com/s/69sq1ttjgwv1qm3/asm.7z

结果:720720(gcc版本4.5.2),720719(gcc版本4.7.0)

编译器标志:-lstdc ++ -static

代码剪断如下:

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int a = 55440, b = 13;
    a *= pow(b, 1);
    cout << a << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

装配输出(4.5.2):

http://pastebin.com/EJAkVAaH

装配输出(4.7.0):

http://pastebin.com/kzbbFGs6

c++ floating-point assembly

10
推荐指数
1
解决办法
1206
查看次数

评估/访问结构

考虑相同代码的两个略有不同的版本:

struct s
{
  int dummy[1];
};

volatile struct s s;

int main(void)
{
  s;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

struct s
{
  int dummy[16];
};

volatile struct s s;

int main(void)
{
  s;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下是我使用gcc 4.6.2获取的内容:

_main:
        pushl   %ebp
        movl    %esp, %ebp
        andl    $-16, %esp
        call    ___main
        movl    _s, %eax
        xorl    %eax, %eax
        leave
        ret

        .comm   _s, 4, 2
Run Code Online (Sandbox Code Playgroud)

_main:
        pushl   %ebp
        movl    %esp, %ebp
        andl    $-16, %esp
        call    ___main
        xorl    %eax, %eax
        leave
        ret

        .comm   _s, …
Run Code Online (Sandbox Code Playgroud)

c gcc struct volatile

10
推荐指数
1
解决办法
255
查看次数

虚拟并行端口仿真器

在我的计算机网络课程中,我们应该通过使用本机寄存器来学习并行端口编程(比如使用outportb之类的命令).我没有并行端口(因为我住在2011年)但想要练习程序(我使用dosbox安装了旧的turboc 3 IDE).是否有一个模拟并行端口的程序,如此程序模拟串口?

c virtualization emulation device

9
推荐指数
1
解决办法
6654
查看次数

使用xchg时我们需要mfence吗?

我有一套xchg基于测试的装配锁.我的问题是:

使用指令时是否需要使用内存防护(mfence,sfencelfence)xchg

编辑:

64位平台:采用Intel nehalem

c c++ x86 assembly memory-fences

8
推荐指数
3
解决办法
3158
查看次数

使用函数调用初始化静态变量会产生编译错误?

#include <stdio.h>
int foo(){
    return 1;
}
int main(void) {
    static int q = foo(); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是相同的链接.这是一个C代码而不是C++.它编译并在C++中运行良好,但不是C.

此代码出现编译错误.有人可以解释为什么会出错?静态成员只能用常量值初始化吗?在C++中,我们需要在声明静态成员后对其进行DEFINE,为什么在C中不需要它?我找不到任何具有类似查询或良好答案的线程.

c static

8
推荐指数
2
解决办法
5833
查看次数

Grub并进入实模式(低级汇编语言编程)

我一直在玩玩具操作系统,并一直使用grub作为我的引导加载程序.最近在尝试使用VGA时,我发现我无法使用硬件中断.我发现这是因为我被grub挂入了保护模式.

有没有人知道怎么回到实模式而不必摆脱grub?

x86 assembly grub real-mode

7
推荐指数
1
解决办法
1676
查看次数

如何使用写入地址捕获内存写入和调用函数

我想捕获内存写入特定的内存范围,并调用一个函数与写入的内存位置的地址.优选地,在已经发生对存储器的写入之后.

我知道这可以通过操作系统通过使用页表条目来完成.但是,如何在想要执行此操作的应用程序中完成类似的操作?

memory windows device-emulation

7
推荐指数
1
解决办法
3692
查看次数

IVT和IDT有什么区别?

在Linux系统上,中断向量表(IVT)和中断描述符表(IDT)之间有什么区别?

x86 interrupt

7
推荐指数
2
解决办法
4839
查看次数

使用FPU和MMX寄存器作为"通用寄存器"

大多数汇编程序利用4个通用寄存器eax ebx ecx edx,但我发现,很多时候我需要使用超过4个寄存器来轻松地完成我的任务,而不必pushpop从堆栈得多.由于我的程序无意使用FPU或MMX寄存器进行浮点计算或"预期用途",在程序中使用这些额外的寄存器是否可以接受?

例如.使用xmm0一个循环递增计数器腾出ecx寄存器做其他事情.

x86 assembly cpu-registers

7
推荐指数
1
解决办法
852
查看次数