在C中的变量之间复制

时间:2016-01-22 00:42:56

标签: c variables copy

我想将unsigned int值复制到char [2]变量。我认为复制是直截了当的,因为它们都具有相同的大小(16位)。这是我的代码:

#include <stdlib.h>
#include <stdio.h>
int main()
{
    unsigned short a = 63488; //16 bit value which is 1111100000000000;
    unsigned char* b = malloc(2); 
    *b = a;
    printf("%d\n",b[0]); // I expect the lower part here which is 0
    printf("%d\n",b[1]); // I expect the higher part here which is 11111000
    return 0;
} 

但我的结果显示零值。我是否必须单独复制每个部分?还没有其他更简单的方法吗?

谢谢

2 个答案:

答案 0 :(得分:5)

如果您只想解释 short作为char数组,您甚至不需要复制。刚演员:

#include <stdio.h>
int main()
{
    size_t i;
    unsigned short a = 63488;
    unsigned char* b = (unsigned char*)&a;    // Cast the address of a to
                                              // a pointer-to-unsgigned-char

    printf("Input value: %d (0x%X)\n", a, a);

    printf("Each byte:\n");
    for (i = 0; i < sizeof(a); i++)
        printf("b[%d] = %d (0x%X)\n", i, b[i], b[i]);

    return 0;
}

输出:

$ gcc -Wall -Werror so1.c && ./a.out
Input value: 63488 (0xF800)
Each byte:
b[0] = 0 (0x0)
b[1] = 248 (0xF8)

请注意,我在x86 PC上运行了这个,这是一个 little endian 机器,这就是为什么第一个字节是输入的低字节。

另请注意,我的代码也从不对short的大小做出假设。

答案 1 :(得分:3)

试试这个

memcpy(b, &a, sizeof(a));

或者

b[0] = a & 0xFF;
b[1] = (a >> 8) & 0xFF;

请注意,b的类型为unsigned char,因此分配给*b的值应该是相同类型的值,否则该值将被截断。