我一直在努力尝试将十六进制转换为二进制。 我被分配编写了一段代码来计算全加器的输出 电路。部分分配是确定用户输入数字的基础。我一直在测试我的代码是否正常工作,我注意到十六进制转换器中有些奇怪的东西。
如果我输入任何值高于“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;
}
答案 0 :(得分:2)
在C ++中,以0
开头的数字常量是八进制数。常数000
和001
在基数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}}