为什么在下一个代码中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位(没有填充)。