【问题标题】:Program not giving hex value?程序没有给出十六进制值?
【发布时间】:2018-08-26 16:07:53
【问题描述】:

我的程序为 Decimal 提供了正确的值,但我使用 char 来为 Hex 设置 gt 值

谁能看到我的代码并告诉我为什么我的输出只是一个“?” (附上我的输出作为图像)

我知道你可以添加 char 值。

这是我的代码。请不要试图更改我的整个代码,说我正在做的是“更长的路”。

请注意,我现在只测试 HexVal1,因为它只考虑前 4 位。

程序应该做的是取二进制的前 4 位并抛出一个十六进制字符。

#include <math.h>
#include <stdio.h>

int main()
{

    int bit1,bit2,bit3,bit4,bit5,bit6,bit7,bit8;
    int dec1,dec2,dec3,dec4,dec5,dec6,dec7,dec8;
    char hex1,hex2,hex3,hex4,hex5,hex6,hex7,hex8;
    int BinVal;
    char HexVal1;
    char HexVal2;

    printf("Please enter the first bit(0 or 1): ");
    scanf("%d",&bit1);
    printf("Please enter the second bi(0 or 1): ");
    scanf("%d",&bit2);  
    printf("Please enter the third bit(0 or 1): ");
    scanf("%d",&bit3);  
    printf("Please enter the fourth bit(0 or 1): ");
    scanf("%d",&bit4);  
    printf("Please enter the fifth bit(0 or 1): ");
    scanf("%d",&bit5);  
    printf("Please enter the sixth bit(0 or 1): ");
    scanf("%d",&bit6);  
    printf("Please enter the seventh bit(0 or 1): ");
    scanf("%d",&bit7);
    printf("Please enter the eigth bit:(0 or 1): ");
    scanf("%d",&bit8);


    if(bit1==1){
        dec1=1;
        hex1='1';
        }

    else{
    dec1=0;
    hex1='0';
    }

        if(bit2==1){
        dec2=2;
        hex2='2';
        }

    else{
    dec2=0;
    hex2='0';
    }

        if(bit3==1){
        dec3=4;
        hex3='4';
        }

    else{
    dec3=0;
    hex3='0';
    }

        if(bit4==1){
        dec4=8;
        hex4='8';
        }

    else{
    dec4=0;
    hex4='0';
    }

        if(bit5==1){
        dec5=16;
        hex5='16';
        }

    else{
    dec5=0;
    hex5='0';
    }

        if(bit6==1){
        dec6=32;
        hex6='32';
        }

    else{
    dec6=0;
    hex6='0';
    }

        if(bit7==1){
        dec7=64;
        hex7='64';
        }

    else{
    dec7=0;
    hex7='0';
    }

        if(bit8==1){
        dec8=128;
        hex8='128';
        }

    else{
    dec8=0;
    hex8='0';   
       }






    BinVal=dec1+dec2+dec3+dec4+dec5+dec6+dec7+dec8;
    printf("Binary value for your decimal number is %d",BinVal);

    HexVal1=sizeof(hex1)+sizeof(hex2)+sizeof(hex3)+sizeof(hex4);

    if(HexVal1==15){
        HexVal1='F';
    }

    else if (HexVal1==14){
     HexVal1='E';
    }

    else if (HexVal1==13){

    HexVal1='D';
    }

    else if(HexVal1==12){

    HexVal1='C';
    }

    else if(HexVal1==11){

    HexVal1='B';
    }

    else if(HexVal1==10){
    HexVal1='A';
    }


    printf("\nHex Val for first 4 bits is %c", HexVal1);

    return 0;

}

输出如下

Please enter the first bit(0 or 1): 1
Please enter the second bi(0 or 1): 0
Please enter the third bit(0 or 1): 0
Please enter the fourth bit(0 or 1): 1
Please enter the fifth bit(0 or 1): 1
Please enter the sixth bit(0 or 1): 1
Please enter the seventh bit(0 or 1): 1
Please enter the eigth bit:(0 or 1): 1
Binary value for your decimal number is 249
Hex Val for first 4 bits is 

【问题讨论】:

  • 你为什么要这样做:HexVal1=sizeof(hex1)+sizeof(hex2)+sizeof(hex3)+sizeof(hex4);
  • 你知道sizeof 是做什么的吗? hex8='128' 不合法,hex8 只能容纳单个字符,'128' 是多字符字符常量
  • 检查我发布的图片的超链接,你会看到程序应该做什么
  • @MuhammadShaeelAbbas 请不要张贴输出图片,将输出复制并粘贴到您的问题中!
  • 如果你有一个整数并且你想以十进制和十六进制打印出来,只需使用printf%d%x。如果您想学习如何操作单个位和字节,并自己进行“十六进制转换”,请使用循环、移位和掩码,或乘法和除法。有关提示,请参阅 C FAQ list(和 this footnote)中的 question 20.10

标签: c math binary char hex


【解决方案1】:

无需重写整个内容。作为一种学习练习,将事情做“长期”是很有价值的。您可以稍后进行优化。但是,由于一些误解,您的代码不起作用。看看这些主题:

因此,为了让您的代码工作的最小更改,您根本不想将这些单引号值分配给您的“十六进制”变量;您只想分配不带引号的数值。 (另外,你至少应该使用unsigned char 来确保它们可以保持128 的值。)

unsigned char hex1,... /* etc. */

hex8=128;

然后你可以把它们加起来:

unsigned char HexVal1, HexVal2;
HexVal1 = hex1 + hex2 + hex3 + hex4;
HexVal2 = (hex5 + hex6 + hex7 + hex8) / 16;

这将为 HexVal1 和 HexVal2 提供您期望的 0 到 15 范围。 (与 HexVal1 的值始终为 4 的原始代码不同!)

那么,你最后的转化也是有问题的。您正在将数值 10-15 更改为字符“A”-“F”,这很好……但您也必须转换较低的值! 4'4' 的值不同。 (这就是您的程序输出问号的原因。HexVal1 包含值 4,它不是可打印的字符。请参阅ASCII character set。)

您可以做很多很多事情来进一步改进它,但如果您进行这些最小的修复,您的代码应该可以工作。

【讨论】:

  • 你真的是一个很好的帮手,你指出了我错在哪里。我唯一要弄清楚的是转换。如果我的十六进制值小于 10,它将给出一个问号。如果是 10 就会给 A 我还在考虑呢!
  • 很高兴为您提供帮助!你的意思是,如何将值 0-9 转换为正确的值?嗯,有几种方法。你可以像 10-15 一样做。例如:if (HexVal1==9) { HexVal1 = '9'; }。希望您能区分9'9'。如果没有,请查看ASCII character set。左边第一列是不可打印的字符,包括0-15。数字 '0' - '9' 位于第二列的下半部分,您会注意到它们的 numerical 值实际上是 48-57。这有意义吗?
  • 如果你看字母可能更容易思考。 'A' - 'F' 位于第三列的顶部,它们的数值实际上是 65-70。然后你只需要意识到'0' - '9' 只是字符——图形渲染的形状——与字母或标点符号没有区别。这些字符与任何其他字符一样具有数字表示。
  • 另外,如果您同意我正确回答了您的问题,请接受我的回答。 :-)
  • 实际上没关系,我只是忘记将 hex5 替换为 1,将 hex6 替换为 2,将 hex7 替换为 4,将 hex8 替换为 8。它们仍然具有旧值,所以没关系。你的回答已被我的朋友接受。愿你兴旺发达!谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-07-26
  • 2018-11-30
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 2015-07-23
相关资源
最近更新 更多