Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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=1?_C - Fatal编程技术网

为什么在下一个代码中c=1?

为什么在下一个代码中c=1?,c,C,为什么在下一个代码中c=1 #include <stdio.h> int main() { int i = 65537; char c = (char)i; printf("c = %d\n",c); /* why c =1 */ return(0); } #包括 int main() { int i=65537; char c=(char)i; printf(“c=%d\n”,c);/*为什么c=1*/ 返回(0); } 字符只存储1个字节。通过

为什么在下一个代码中
c=1

#include <stdio.h>

int main()
{
    int i = 65537;
    char c = (char)i;
    printf("c = %d\n",c); /* why c =1 */
    return(0);
}
#包括
int main()
{
int i=65537;
char c=(char)i;
printf(“c=%d\n”,c);/*为什么c=1*/
返回(0);
}

字符只存储1个字节。通过将
c
分配给
int
值,只分配最低的字节

65537=256*256+1


因此
c=1。

65537是0x1000001(十六进制,100000000000001二进制)。如果将此值强制转换为仅一个字节长的字符,则只能从0x1001中获取最低(最低有效)字节,即十进制0x01=1。

字符类型只有8位长,而int有32位。 将int变量指定给char时,该值仅被剪切为8个最低有效位

65537是二进制的
10000000 00000001


因此,最低有效字节是
00000001

这用于从int转换为char: int i=65537; char c=(char)i

前四个字节是从100000000000001开始的:这就是为什么它是1
如果您使用65539(100000000000011),char将是3

您希望它是什么?因为65537是二进制100000000000001。@Joachim Pileborg这种类型转换与endianness有什么关系?!它将在大端和小端上产生1。否。我需要解释为什么c=1,为什么(char)I=int I 65537=c=1是的,注释实际上是在解释这种行为。有关详细信息,请参阅答案。“int有32位”这实际上取决于体系结构。@m0skit0哦,实际上OP遇到的整个行为都与平台有关。因为在某些平台上,
char
的长度可以远远超过8位,所以65537不会被截断。感谢您的更正@IgorR,我认为char在C中定义为1字节长。在char大于8位的平台上,我如何创建1字节长的东西?
char
是字节(即标准要求sizeof(char)==1),但字节不一定是8位。例如,在
char
有9位的系统上,没有一种类型正好有8位(没有填充)。