int 到 char cast,奇怪的行为

int to char cast, strange behavior

考虑以下几点:

unsigned int  i1 = 0xFFFFFFFF;
unsigned char c1 = i1;
char          c2 = i1;

printf("%x\n", i1);       // 0xFFFFFFFF as expected
printf("%x\n", c1);       // 0xFF as expected
printf("%x\n", c2);       // 0xFFFFFFFF ????
printf("%d\n", c1 == c2); // false ????

我知道,不应该将 int 分配给 char。无论如何,看看 c2 似乎存储的不仅仅是一个字节。我所期望的是将 n1 的“次要字节”复制到 c2 中。我的假设是错误的吗?完全没有副本吗?为什么 unsigned char 的行为不同于 char


我实际上在使用 gethostbyname() 时在一个非常具体的情况下发现了这一点。它 returns 一个包含字段 char *h_addr 存储 ipv4 地址(四个 8 位长数字)的结构。我想将 ip 地址打印为数字,但得到的结果异常大。


我知道一个解决方法,使用 i1 & 0xFF 进行屏蔽是可行的,但我想了解这个问题。

在您的系统中,类型 char 的行为与类型 signed char 的行为相同。

这次作业后

char          c2 = n1;

注意:好像打错了,你的意思是

char          c2 = i1;

变量 c2 的值为 0xff-1

在本次通话中

printf("%x\n", c2);

由于整数提升,参数表达式 c2 被转换为传播符号位的类型 int。而这个值是按照格式%x.

输出的

注意需要写

printf( "%x\n",( unsigned int ) c2 );

因为转换说明符 x 需要类型为 unsigned int 的对象。

如果您想获得预期的结果,您需要使用转换修饰符 hh 将对象输出为字符类型的对象。例如

#include <stdio.h>

int main(void) 
{
    unsigned int  i1 = 0xFFFFFFFF;
    unsigned char c1 = n1;
    char          c2 = n1;

    printf( "%x\n", i1 );
    printf( "%hhx\n", c1 );
    printf( "%hhx\n", c2 );
}

程序输出为

ffffffff
ff
ff

另外你好像打错了

printf("%d\n", n3 == n2);

而不是

printf("%d\n", c1 == c2);

如果是这样,那么由于整数提升,比较运算符的操作数再次隐式转换为类型 int。由于操作数 c1 的类型为 unsigned char 然后它被转换为值 0x000000FF 而操作数 c2 因为它存储负值被转换为值 0xFFFFFFFF.所以结果值彼此不相等。