Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;错误的算术结果_C++_Math_Hex - Fatal编程技术网

C++ C++;错误的算术结果

C++ C++;错误的算术结果,c++,math,hex,C++,Math,Hex,我正在使用visual Studio express为桌面编写一个程序。程序中给我带来麻烦的部分是取一个十六进制值,它是2^32的一个分数,然后将它转换成一个整数值,并使用下面的编程位对它执行一些简单的数学运算(乘法和除法) if (ch == 'z') { std::string r, d; unsigned int ra; unsigned int dec, n = 1; r = readline;

我正在使用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";
    }
正确的值应为:(*不正确值旁边)


我认为使用long int可能会解决这个问题,但它给出了相同的结果。我还尝试对值使用double类型,这会产生同样奇怪的结果。如果你也能解释为什么一个十六进制转换有效而另一个无效,我将不胜感激。我是新的C++,并意识到我可能会错过一些在C++中的很多教程。(注意dec表示偏角,而不是十进制,与代码无关)。

显然,您正在一个平台上工作,其中
unsigned int
是32位大的<代码>0x1180C1E00不适合32位
ss>>ra
尝试解析此字符串时遇到溢出,并失败<代码>ra保持未初始化状态;对它的任何进一步操作都会显示未定义的行为

还有,改变

double DEC = (dec * 1296000);

如前所述,对两个整数执行算术运算,然后将结果转换为double。但是结果不适合于无符号整数,并且在转换之前被包装在模2^32上。我建议的更改将
dec
转换为double,然后执行浮点乘法


在MSVC中,
unsigned long
是32位大的,就像
unsigned int
一样。全面使用
unsigned long
应该会有所帮助-它是64位大的

 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;
unsigned long long int ra,dec;
stringstream ss,dd;
ss ra;
dd-dec;

cout
ra==3435973836==0xCCCC
,这是调试器表示“未初始化变量”的方式。显然,
ss>>ra
失败了。哪个编译器、哪个操作系统在构建32位或64位?请发布实际代码(例如,第一个
cout
不应输出十六进制值,并且
ra
dec
未声明)。另外,您希望得到的值超出了典型的
无符号int
的范围。在使用它们之前,您确实在实际代码中的某个地方初始化了
r
d
?很抱歉,我编辑了一些用于调试的内容。包含所有变量的代码现在都已启动。@IgorTandetnik我正在使用visual Studio express for desktop进行编译。将其作为Win32控制台应用程序编写。我从串行端口获取输出。感谢您指出我需要long-long int来拟合这些值。
double DEC = (dec * 1296000.0);
 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;