我正在尝试创建一个将二进制数(字符串)转换为十进制数(int)的函数。关于以下代码的奇怪部分是当行“// cout<< index<< endl;”时没有注释掉,它的确有效!为什么D:?
注释时的输出:
1651929379
激活时输出:
7 192程序以退出代码结束:0
以下是整个计划:
//
// testish.cpp
// Egetskojs
//
// Created by Axel Kennedal on 2014-02-13.
// Copyright (c) 2014 Axel Kennedal. All rights reserved.
//
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int BinaryToDecimal(string & binaryString);
int main(){
string binary = "11000000";
int decimal = BinaryToDecimal(binary);
cout << decimal << endl;
return 0;
}
int BinaryToDecimal(string & binaryString){
int solution;
if (binaryString == "0") solution = 0;
if (binaryString == "1") solution = 1;
int index = binaryString.length() - 1; //The index of the last (rightmost) bit in the string
//cout << index << endl;
int currentBit = 0; //The exponent to be used when calculating the value of a bit
for (; index >= 0; index--) {
if (binaryString.at(index) == '1') {
solution += pow(2, currentBit);
}
//Else: nothing happens
currentBit++;
}
//Done!
return solution;
}
答案 0 :(得分:4)
BinaryToDecimal
中有未定义的行为,因为变量solution
可能未经初始化使用。
未初始化的局部变量将具有不确定的值(即它们的值看似随机)。
答案 1 :(得分:0)
正如Joachim所说,你的解决方案变量是未初始化的,所以当字符串既不是“0”也不是“1”时,你的+ =操作可能会出现奇怪的行为(例如整数溢出)。我想当输出有效时它工作的事实是由于输出指令的一些奇怪的副作用导致一些寄存器包含0,并且该寄存器是solution
的值的来源。知道你的编译器设置是什么,并查看代码的这部分的汇编代码可能很有启发性。
你可以替换:
int BinaryToDecimal(string & binaryString){
int solution;
if (binaryString == "0") solution = 0;
if (binaryString == "1") solution = 1;
...
使用:
int BinaryToDecimal(string & binaryString){
int solution = 0;
...
由于您执行的特殊情况处理优先由您的循环处理。