我正在编写一个程序,该程序将CIL字节码转换为C源代码以供机器使用。我担心浮点常量由于转换为十进制和从十进制转换而不准确。经过一些研究,我发现C(而不是C++)应该能够接受浮点常量的十六进制表示法。
我决定尝试一下,但无论我尝试什么,MSVC9都会给我错误。以下是我正在尝试的:
// Switches: /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FD /MDd /Fo"Debug\" /Fd"Debugvc90.pdb" /W3 /nologo /c /ZI /TC
#include <tchar.h>
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
double d = 0x1.0p+1; // error C2059
//double d = 0x1p+1; // doesn't work either
//double d = 0x1p1; // doesn't work either
//double d = 0x1.0p1; // doesn't work either
printf( "%fn", d );
return 0;
}
我本以为这会打印出2,从1x2^1,但它给了我这个编译器错误:
error C2059: syntax error : 'bad suffix on number'
我意识到C++不支持这种语法(或者我已经读过了),但注意到这是用/TC
编译的,所以它应该是直接的C,而且我也使用了*.c
文件名。
是我做错了什么,还是VC9不符合标准?
您的代码没有任何问题。在C99标准中,浮点十六进制常量被添加到C中,但MSVC只支持旧的C90标准(带有一些扩展,如//
单行注释和long long
类型)。
C++17标准添加了对C99十六进制浮点文字的完全支持。Visual C++将在Visual Studio 2017 15.6版本中提供它们。