Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中变量间的复制_C_Variables_Copy - Fatal编程技术网

C语言中变量间的复制

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

我想将无符号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;
} 
#包括
#包括
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])然后它可以正常工作。这加强了以下语句:始终启用所有警告,然后修复这些警告