复制char数组并从复制的数组中打印十六进制会出现错误

时间:2018-07-30 07:15:43

标签: c

我正在尝试一个基本程序,将元素从一个数组复制到另一个数组。源数组具有更多元素。从源到目标复制元素时,我仅从源数组复制了几个元素。

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

当我以十六进制形式打印目标数组时,最后一个元素是不同的。也就是说,这些元素在不知不觉中加起来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来自哪里?

enter image description here

幕后发生了什么?????

预先感谢

1 个答案:

答案 0 :(得分: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