c++ - 将 2 的补码转换为小数。输出是双

标签 c++ linux cygwin

我有一个项目,该项目的一部分是将给定的 0 和 1 字符串转换为小数。 (所以,将二进制转换为十进制,2-s 和非 2s 补码) 但是我遇到了一个奇怪的问题。 当我使用 IDE(例如 Visual Studio 和 Code Block)编译和运行程序时,输出结果是正确的。 但是当我用 Cygwin 或在 Linux 机器上编译和运行它时,数字变成了两倍。 不是所有的都来两次(就像乘以 2)。 例如,8 位 2s 补码:1111 1111 应该是十进制的 -1,但是这个程序在 Linux 机器上运行时输出 -2。

有人知道为什么会这样吗?

这是函数的代码;

int convertToDecimal(string line)
{
    int num = 0;
    if (line[0] == '1')
    {
        for (int i = 0; i < line.length(); i++)
        {
            if (line[i] == '1')
                line[i] = '0';
            else
                line[i] = '1';
        }
        for (int i = 0; i < line.length(); i++)
        {
            int  j = line.length() - 1 - i;
            if (line[j] == '1')
                num = num + pow(2.0, double(i));
        }
        num = -1 * (num + 1);
        return num;
    }

    for (int i = 0; i < line.length(); i++)
    {
        int  j = line.length() - 1 - i;
        if (line[j] == '1')
            num = num + 1 * pow(2, i);
    }
    return num;
}


The expected output should be and what i get with Codeblocks or Visual Studio: 
11111111111111111111111111111111    -1
11111111111111111111111111111110    -2
11111111111111111111111111111101    -3
11111111111111111111111111111100    -4
00000000000000000000000000001010    10

What I get is when run into Cygwin or Linux machine:
11111111111111111111111111111111    -2
11111111111111111111111111111110    -4
11111111111111111111111111111101    -6
11111111111111111111111111111100    -8
00000000000000000000000000001010    20

非常感谢任何帮助。为什么会发生,什么可以解决它。 我从来没有遇到过这样的问题。我在 Window 8.1 中运行 Cygwin CodeBlocks 和 VS 另外,有没有办法在程序中写入,以便检测正在运行的机器?

最佳答案

读取二进制数的标准方法是从整数值 0 开始,对于读取的每一位(从左到右),将当前值乘以 2(即左移 1 位),然后加上位读取以获得新值。例如:

输入:01011

+---------+-----------+
| Char In | New Value |
+---------+-----------+
|    0    |     0     |
|    1    |     1     |
|    0    |     2     |
|    1    |     5     |
|    1    |    11     |
+---------+-----------+

如果您知道前导 1 的值将被视为有符号值,请使用有符号整数运行值,并将其设置为所有的特殊情况( ~0L 或等效项)如果第一个数字是 1

输入:101011

+---------+-----------+
| Char In | New Value |
+---------+-----------+
|    1    |    -1     |
|    0    |    -2     |
|    1    |    -3     |
|    0    |    -6     |
|    1    |   -11     |
|    1    |   -21     |
+---------+-----------+

至于您的具体问题,除了计算二进制补码的非常困惑的方法之外,您的代码还错误地假设输入字符串 01 个字符。任何其他字符都被视为 0 字符。因此,如果有什么东西在字符串末尾附加了一个额外的字符,那么它就会显示为这个错误。

我敢打赌,您调用此函数的代码不会清理字符串,并且末尾有一个额外的字符(可能是 \r 或空格)。

关于c++ - 将 2 的补码转换为小数。输出是双,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27118139/

相关文章:

c++ - boost.log std::exception格式化程序无法在自己的命名空间中找到运算符<<重载

java - 如何提高Jboss 使用的内存量?

Emacs:文件名的 Tab 完成附加一个额外的 i:\cygwin

c - 为什么 cmake 在 Windows 上使用 cygwin 为 netcdf 提供 undefined reference ?

bash - 如何加速Cygwin?

simdjson 库未捕获 C++ 异常

c++ - 加载位图文件 (.bmp)

c++ - 我的 vector vector 是内存安全的吗?

linux - 如何使用 brewperl 在 Ubuntu 上安装应用程序

regex - 从行 block 中有选择地提取行