考虑以下:
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()时,这是在非常具体的情况下发现的。它返回一个结构,该结构包含一个char *h_addr
存储ipv4地址(四个8位长数字)的字段。我想将IP地址打印为数字,但结果异常大。
我知道一种解决方法,可以掩盖i1 & 0xFF
作品,但我想了解这个问题。
在您的系统中,类型的char
行为与type相同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
。
如果要获得期望的结果,则需要使用conversion Modify将对象输出为字符类型的对象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
。因此,结果值彼此不相等。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句