我正在使用面向桌面的visual studio express编写程序。程序中给我带来麻烦的部分是取十六进制值,它是2 ^ 32的一小部分并将其转换为整数值,并使用以下编程位对其执行一些简单的数学运算(乘法和除法)。
if (ch == 'z')
{
std::string r, d;
unsigned int ra;
unsigned int dec, n = 1;
r = readline;
while (n < 9)
{
r = r + buffer[0];
n++;
ReadFile(file, buffer, sizeof(buffer), &read, NULL);
}
ReadFile(file, buffer, sizeof(buffer), &read, NULL);
n++;
while (n > 9 && buffer[0] != '#')
{
d = d + buffer[0];
n++;
ReadFile(file, buffer, sizeof(buffer), &read, NULL);
}
std::cout << "\n hex RA=" << r << " Hex Dec=" << d << "\n";
std::stringstream ss,dd;
ss << std::hex << r;
ss >> ra;
dd << std::hex << d;
dd >> dec;
std::cout << "\n ra=" << ra << " dec=" << dec << "\n";
double RA = (ra * 86400);
double DEC = (dec * 1296000);
std::cout << "\n RA=" << RA << " DEC=" << DEC << "\n";
double rRA = (RA / pow(2,32));
double dDEC = (DEC / pow(2,32));
std::cout << "\n RA=" << rRA << " DEC=" << dDEC << "\n";
}
我得到以下输出:
hex RA=1180C1E00 Hex Dec=0EA8A900
ra=3435973836 dec=245934336
RA=4294898176 DEC=1376419840
RA2=0.999984 DEC2=0.320473
正确的值应为:( *不正确的值旁边)
hex RA=1180c1e00 HEX Dec=0ea8a900
*ra=4698414592 dec=245934336
*RA=40594302074880 *DEC=318730899456000
*RA2=94515.9748... *DEC2=74210.3204727...
我认为使用long int可能会解决问题,但它给出了相同的结果。我也尝试使用double类型的值给出同样奇怪的结果。如果你也可以解释为什么一个十六进制转换工作而另一个没有,我会很感激。我是C ++的新手,并且意识到在阅读C ++的许多教程时我可能会遗漏一些错误。 (注意dec表示赤纬,而不是十进制,与代码无关。)
答案 0 :(得分:1)
显然,您正在开发unsigned int
为32位大的平台。 0x1180C1E00
不适合32位。 ss >> ra
在尝试解析此字符串时遇到溢出,并失败。 ra
仍然没有初始化;对它的任何进一步行动都表现出不确定的行为。
另外,更改
double DEC = (dec * 1296000);
到
double DEC = (dec * 1296000.0);
如上所述,您对两个整数执行算术运算,然后将结果转换为double。但结果并不适合unsigned int
,并且在转换之前以模2 ^ 32包裹。我建议的更改将dec
转换为double,然后以浮点执行乘法。
使用MSVC时,unsigned long
大小为32位,就像unsigned int
一样。使用unsigned long long
四处应该有帮助 - 它是64位大。
答案 1 :(得分:1)
hex RA=1180C1E00 Hex Dec=0EA8A900
如果您可以将该值作为字符串使用,则下面的程序可以根据需要使用。
unsigned long long int ra,dec;
stringstream ss,dd;
ss << hex << "1180C1E00";
ss >> ra;
dd << hex << "0EA8A900";
dd >> dec;
cout << "\n ra=" << ra << " dec=" << dec << "\n";
unsigned long long int RA = (ra * 86400);
unsigned long long int DEC = (dec * 1296000);
cout << "\n RA=" << RA << " DEC=" << DEC << "\n";
double rRA = RA/(pow(2.0,32));
double dDEC = DEC/(pow(2.0,32));
cout << "\n RA2=" << rRA << " DEC2=" << dDEC << "\n";
return 0;
我希望这可以提供帮助。