我想将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;
}
但我的结果显示零值。我是否必须单独复制每个部分?还没有其他更简单的方法吗?
谢谢
答案 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
的值应该是相同类型的值,否则该值将被截断。