我有一个项目,项目的一部分是将给定的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中 此外,有没有办法在程序中写入,以便检测正在运行的机器?
答案 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
或空格)。