【问题标题】:Copying char array and printing hex from copied array gives error [duplicate]复制 char 数组并从复制的数组打印十六进制会出错 [重复]
【发布时间】:2018-07-30 07:15:43
【问题描述】:

我正在尝试一个基本程序来将元素从一个数组复制到另一个数组。源数组有更多元素。在将元素从源复制到目标时,我只从源数组中复制少量元素。

我的源数组包含一些十六进制值。

当我以十六进制形式打印目标数组时,最后一个元素是不同的。即元素在不知不觉中加起来ffffff

这里是示例程序

void String_Copy(char *src, char *dest, int length)
{
    for (int i=0; i<length; i++)
    {
        dest[i] = src[i];
    }
}

int main(void)
{
    char firstStr[] = {0x01,0x03,0x02,0x13,0x88,0xB5,0x12};
    char secStr[5];

    String_Copy(firstStr,secStr,5);

    for (int i=0;i<5;i++)
    {
        printf("%02x ",secStr[i]);
    }

}

这里我只想复制五个元素并打印输出。

预期输出:01 03 02 13 88

获取输出:01 03 02 13 ffffff88

这些ffffff来自哪里???

幕后发生了什么????

提前致谢

【问题讨论】:

  • 好的会记住这一点(谢谢)。
  • 将char的数据类型设为unsigned char并打印数组?
  • 是的,它在使用 unsigned 后可以工作,我知道为什么会这样。

标签: c


【解决方案1】:

你看到的是符号扩展的结果。您的平台显然有一个 signed char 类型,因此您在初始化中已经有了实现定义的行为:

char firstStr[] = {0x01,0x03,0x02,0x13,0x88,0xB5,0x12};

0x88 不能用你的char 类型表示,可能最大值是0x7f。如果类型不能表示值,则转换为 signed 类型的结果是实现定义的。在您的情况下,它会导致一些负数。

现在,您对printf() 的参数受整数提升规则的约束,它被转换为int。对于负数,这意味着在额外的位置添加1 位,这就是为什么在尝试将其打印为无符号时会看到一堆0xf 十六进制数字的原因。顺便说一句,这也没有明确定义,%x 期望 unsigned,但你给它一个 signed 值。

最简单的解决方案是在任何地方都使用unsigned char。此外,将格式字符串更改为 %02hhx 以告诉 printf() 它只是一个无符号 char,而不是无符号 int

【讨论】:

    猜你喜欢
    • 2013-02-14
    • 2012-12-14
    • 1970-01-01
    • 2012-05-09
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2015-05-05
    相关资源
    最近更新 更多