C语言中变量间的复制
我想将无符号int值复制到char[2]变量。我认为复制是直接进行的,因为它们都有相同的大小(16位)。这是我的密码:C语言中变量间的复制,c,variables,copy,C,Variables,Copy,我想将无符号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; pri
#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;
}
#包括
#包括
int main()
{
无符号短a=63488;//16位值,为11111 00000000000;
无符号字符*b=malloc(2);
*b=a;
printf(“%d\n”,b[0]);//我希望下面的部分是0
printf(“%d\n”,b[1]);//我希望这里的较高部分是11111000
返回0;
}
但我的结果显示为零值。我必须分别复制每个部分吗?难道没有其他更简单的方法可以做到这一点吗
谢谢像这样试试
memcpy(b, &a, sizeof(a));
或
请注意,b
的类型为无符号字符
,因此分配给*b
的值应为同一类型的值,否则该值将被截断。尝试这样做
memcpy(b, &a, sizeof(a));
或
请注意,b
的类型为无符号字符
,因此分配给*b
的值应为相同类型的值,否则该值将被截断。如果您只想将short
解释为字符
数组,您甚至不需要复制。刚出演:
#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;
}
请注意,我在我的x86 PC上运行了这个程序,这是一个小小的endian机器,这就是为什么第一个字节是输入的低位字节
另外请注意,我的代码也从不假设short
的大小,如果您只想将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;
}
请注意,我在我的x86 PC上运行了这个程序,这是一个小小的endian机器,这就是为什么第一个字节是输入的低位字节
另外请注意,我的代码也从未对
short
的大小做出假设,这是对截断的一个很好的解释,但恐怕您的答案不完整:应该就端点问题警告OP。对截断的一个很好的解释,但我恐怕你的答案不完整:应该就endianness问题向OP发出警告。这假设平台上的整数只有16位。今天,这真的不是一个安全的假设。你应该期望大多数平台至少实现32位整数。@DavidHoelzer虽然你没有做出平台假设是对的(请参阅我在回答中如何避免这一点),但请注意,他使用的是short
,在我能想到的每个平台上都是16位。啊,我实际上没有注意到这一点。我刚才看到问题中的“unsigned int”:这假设平台上的整数只有16位。今天,这真的不是一个安全的假设。你应该期望大多数平台至少实现32位整数。@DavidHoelzer虽然你没有做出平台假设是对的(请参阅我在回答中如何避免这一点),但请注意,他使用的是short
,在我能想到的每个平台上都是16位。啊,我实际上没有注意到这一点。我刚才看到问题中的“unsigned int”:如果编译'gcc-Wall-Wextra-Wconversion-pedantic-std=c99-Werror untitled.c&./a.out',则结果为:untitled.c:In函数'main':untitled.c:13:19:error:有符号和无符号整数表达式之间的比较[-Werror=sign compare]for(i=0;i
。但是,如果将i
的声明更正为size\t i:
并将printf()更正为printf(“b[%lu]=%d(0x%X)\n”,i,b[i],b[i])代码>然后它可以正常工作。这加强了以下语句:始终启用所有警告,然后修复这些警告如果编译了`gcc-Wall-Wextra-Wconversion-pedantic-std=c99-Werror untitle.c&./a.out`则结果是:untitle.c:In函数'main':untitled.c:13:19:错误:有符号和无符号整数表达式之间的比较[-Werror=sign compare]对于(i=0;i
。但是,如果将i
的声明更正为size\t i:
并将printf()更正为printf(“b[%lu]=%d(0x%X)\n”,i,b[i],b[i])代码>然后它可以正常工作。这加强了以下语句:始终启用所有警告,然后修复这些警告