我有一个项目,该项目的一部分是将给定的 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 |
+---------+-----------+
至于您的具体问题,除了计算二进制补码的非常困惑的方法之外,您的代码还错误地假设输入字符串仅 0
或 1
个字符。任何其他字符都被视为 0
字符。因此,如果有什么东西在字符串末尾附加了一个额外的字符,那么它就会显示为这个错误。
我敢打赌,您调用此函数的代码不会清理字符串,并且末尾有一个额外的字符(可能是 \r
或空格)。
关于c++ - 将 2 的补码转换为小数。输出是双,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27118139/