将2s补码转换为小数。输出是双倍的

时间:2014-11-25 03:04:49

标签: 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

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

1 个答案:

答案 0 :(得分:2)

读取二进制数的标准方法是从整数值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     |
+---------+-----------+

至于你的具体问题,除了计算二元补码的非常混乱的方法之外,你的代码错误地假设输入字符串仅由{{1>组成 {{1} }或0个字符。任何其他字符都被视为1个字符。因此,如果某些内容在字符串的末尾添加了一个额外的字符,那么它就会显示为此错误。

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