数值基之间的转换出错



我不知道我的程序出了什么问题。在将此"实验"添加到我的项目中之前,我刚刚测试了它是否至少可以在控制台应用程序上使用,正如您所看到的,我失败了。

我制作了一个库,可以在数字基数之间转换数字(到目前为止,只有 B16 或 B2 到十进制)。这是一个很大的解决方法,因为我不太了解如何管理模量和除数,但它似乎一直有效到一定程度。

我给它一个0xFF,它把它当作0xFF0,结果是4,080。我给它一个0x16,它把它当作一个0x160,结果是352。很明显发生了什么,但我不知道为什么会这样。至少,到目前为止,问题只出在B16上,尽管B2也给了我一些奇怪的错误。

这是代码(代码::GNU编译器上的块):

int bin_to_int(char char_digit){
char_digit = toupper(char_digit);
if (char_digit == '0') {return 0;}
else if (char_digit == '1') {return 1;}
else {return 2;}
}
int hex_to_int(char char_digit){
char_digit = toupper(char_digit);
if (char_digit == '0') {return 0;}
else if (char_digit == '1') {return 1;}
else if (char_digit == '2') {return 2;}
else if (char_digit == '3') {return 3;}
else if (char_digit == '4') {return 4;}
else if (char_digit == '5') {return 5;}
else if (char_digit == '6') {return 6;}
else if (char_digit == '7') {return 7;}
else if (char_digit == '8') {return 8;}
else if (char_digit == '9') {return 9;}
else if (char_digit == 'A') {return 10;}
else if (char_digit == 'B') {return 11;}
else if (char_digit == 'C') {return 12;}
else if (char_digit == 'D') {return 13;}
else if (char_digit == 'E') {return 14;}
else if (char_digit == 'F') {return 15;}
else {return 16;}
}
void conv_todec(int mode_base){
if (mode_base == 16){std::cout << "nHex to Dec function";}
if (mode_base ==  2){std::cout << "nBin to Dec function";}
if (mode_base == 16){std::cout << "nEnter a hex number: ";}
if (mode_base ==  2){std::cout << "nEnter a bin number: ";}
std::string numb;
std::cin >> numb;
int str_leg = numb.length();
int total = 0;
for(int i(0);i<str_leg;i++){
if (mode_base == 16){
if (hex_to_int(numb[i]) == 16){func_erro();return;}}
if (mode_base == 2){
if (bin_to_int(numb[i]) == 2){func_erro();return;}}
}
int digits[str_leg] = {};
int j = str_leg;
for(int i(0);i<str_leg;i++){
if (mode_base == 16) {digits[i] = hex_to_int(numb.at(i));}
if (mode_base ==  2) {digits[i] = bin_to_int(numb.at(i));}
if (mode_base == 16) {total += (digits[i] * power(mode_base,j--));}
//Somehow the number never had the first digit claiming it as
//either even or odd, so I tried pre-decrementing 'j' and it
//worked for some reason I don't know either.
if (mode_base ==  2) {total += (digits[i] * power(mode_base,--j));}}
std::cout << "The result is: " << total << std::endl;
}

这一行:

int j = str_leg;

表示对于十六进制 FF,j 将为 2。这意味着稍后当您power(mode_base,j--)与第一个数字相乘时,您将执行power(16, 2)(请记住,j--表示取j的值,然后从j中减去一个,但仍使用原始值)。因此,您将第一个数字乘以 256,而您只想乘以 16。

解决方案是什么?从较小的j开始。

int j = str_leg - 1;

请注意,这就是为什么二进制版本在使用--j时有效,因为您在使用之前会递减j。所以要么使用--jj = str_leg,要么j--j = strleg - 1

此外,处理模数部分 - 这将使您的程序更容易编写。

最新更新