诸如" 为什么不是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++编译器中发现这样的警告.
我错过了隐藏或很少使用的选项吗?
是否有任何具有此类警告的编译器?
编辑:此警告可用于教育目的,并作为新浮点的提醒.
最近,我编写了一个小程序,并使用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):
装配输出(4.7.0):
考虑相同代码的两个略有不同的版本:
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) 在我的计算机网络课程中,我们应该通过使用本机寄存器来学习并行端口编程(比如使用outportb之类的命令).我没有并行端口(因为我住在2011年)但想要练习程序(我使用dosbox安装了旧的turboc 3 IDE).是否有一个模拟并行端口的程序,如此程序模拟串口?
我有一套xchg基于测试的装配锁.我的问题是:
使用指令时是否需要使用内存防护(mfence,sfence或lfence)xchg?
编辑:
64位平台:采用Intel nehalem
#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中不需要它?我找不到任何具有类似查询或良好答案的线程.
我一直在玩玩具操作系统,并一直使用grub作为我的引导加载程序.最近在尝试使用VGA时,我发现我无法使用硬件中断.我发现这是因为我被grub挂入了保护模式.
有没有人知道怎么回到实模式而不必摆脱grub?
我想捕获内存写入特定的内存范围,并调用一个函数与写入的内存位置的地址.优选地,在已经发生对存储器的写入之后.
我知道这可以通过操作系统通过使用页表条目来完成.但是,如何在想要执行此操作的应用程序中完成类似的操作?
大多数汇编程序利用4个通用寄存器eax ebx ecx edx,但我发现,很多时候我需要使用超过4个寄存器来轻松地完成我的任务,而不必push和pop从堆栈得多.由于我的程序无意使用FPU或MMX寄存器进行浮点计算或"预期用途",在程序中使用这些额外的寄存器是否可以接受?
例如.使用xmm0一个循环递增计数器腾出ecx寄存器做其他事情.