什么可能导致这些奇怪的输出在十六进制到二进制转换器(C ++代码)?

时间:2018-03-05 23:06:35

标签: c++

我一直在努力尝试将十六进制转换为二进制。 我被分配编写了一段代码来计算全加器的输出 电路。部分分配是确定用户输入数字的基础。我一直在测试我的代码是否正常工作,我注意到十六进制转换器中有些奇怪的东西。

如果我输入任何值高于“F”的字符,则返回预期的“Not a hexadecimal”错误。

如果我输入“8”和“F”之间的任何字符(两者都包括在内),我得到预期的“不能用3位二进制数表示”错误。

除了“2”和“3”之外,我还得到所有数字的预期二进制值... 我不知道是什么原因造成了这种意想不到的行为。任何帮助表示赞赏。 您可以尝试自己运行它以更好地理解代码,但这是我的输出:

0 0
1 1
2 8
3 9
4 100
5 101
6 110
7 111
8-F Cannot represent with 3 bits.
>F Not a hexadecimal.

以下是代码:

#include<stdio.h>
#include <ctype.h>
int main(){
    int optionChosen,binaryNum,reset;
    char hexadecimal;
    while (true){
        printf("Please enter input: ");
        fflush(stdin); //This line clears the input buffer 
        //Note: using fflush(stdin) is undefined and is told to be avoided whenever possible
        scanf("%c",&hexadecimal);
        hexadecimal=toupper(hexadecimal);
        if (hexadecimal>'F'){
            //Print an error message if the option chosen by the user is out of range.
            printf("Value out of range! Please enter a valid value (0-F)\n");
        }
        else{
            reset=0;//This is placed here so that the program does not ask for input all the time
            switch (hexadecimal){//using a switch to convert hexadecimal to binary
                case '0':
                    binaryNum=000;
                    break;
                case '1':
                    binaryNum=001;
                    break;
                case '2':
                    binaryNum=010;
                    break;
                case '3':
                    binaryNum=011;
                    break;
                case '4':
                    binaryNum=100;
                    break;
                case '5':
                    binaryNum=101;
                    break;
                case '6':
                    binaryNum=110;
                    break;
                case '7':
                    binaryNum=111;
                    break;
                default:
                    //return error message if default value is entered.
                    reset=1;//This makes sure the user is asked to enter input again.
                    printf("Hexadecimal %c cannot be represented with 3 bits!Please try again \n",hexadecimal);
            }
            if (reset==0){//This breaks the loop and continues with the rest of the code if the user value is in range
                printf("binaryNum = %d\n",binaryNum);
            }
        }
    }
    return 0;
}

3 个答案:

答案 0 :(得分:2)

在C ++中,以0开头的数字常量是八进制数。常数000001在基数2,8或10中相同。在基数8中,010为8,011为9.正如Amav Borborah在注释,C ++现在有二进制文字的0b前缀,而0b10将是2,尽管在这种情况下,它只是一种复杂的输入值返回方式。

这个八进制数的缺陷是来自C的遗留物,它从B编程语言复制它。其历史原因在于,早在70年代创建这些语言时,DEC PDP-7和其他一些小型计算机都有18位字,因此在3位块中指定位模式会起作用,但是十六进制数字太少而五就太多了。那时候,语言设计师并不担心会变得神秘莫测。其他主要的遗留物是传统的三位数字符转义,如'\123'和UNIX文件权限,它们被组织成三位块并显示为八进制。这主要是今天的历史好奇心,因为没有人制造出四十年内可被3整除的电脑。

这可能不是您实际想要处理转换的方式。但是,快速修复以与其他值相同的格式存储只是为了删除前导0

答案 1 :(得分:0)

在整数的开头放置0会使它成为八进制。也就是说,您获得的值将是8而不是10的幂。

这就是为什么:

001 = (0*8^2 + 0*8^1 + 1*8^0) = 1

,而:

011 = (0*8^2 + 1*8^1 + 1*8^0) = 9

答案 2 :(得分:0)

正如其他人提到的那样,问题是以零开头的字面数字在基数8中。

import random
class Lamb():
    def __init__(self, weight, milk, wool, offs, thigh, fert, meat, fat):
        self.weight = weight
        self.milk = milk
        self.wool = wool
        self.offs = offs
        self.thigh = thigh
        self.fert = fert
        self.meat = meat
        self.fat = fat

   def __repr__(self):
       return f"{self.weight,self.milk,self.wool,self.offs,self.thigh,self.fert,self.meat,self.fat}"

def Read(txtfile):
datalist=[]
f = open(txtfile, "r", encoding="utf-8")
for line in f:
    datalist.append(line.split(','))
f.close()
cardlist = []
for i in datalist:
    cardlist.append(Lamb(i[0], i[1], i[2], i[3], i[4], i[5], i[6], i[7]))
return cardlist

你正在伪造二进制文件的其他数字 我会改变你打印价值的方式。

{{1}}