【发布时间】:2021-05-03 17:24:32
【问题描述】:
考虑以下几点:
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 进行屏蔽可以工作,但我想了解这个问题。
【问题讨论】:
-
什么是 n1、n2 和 n3?我看到 i1(不是 n1)。
-
当传递给
printf时,char正在转换为int。 -
你学会了在混合有符号和无符号值时非常非常小心。我怀疑如果你启用所有编译器警告,你会得到很多。
-
“我知道,不应该将 int 分配给 char”——还有更多需要学习的东西。你一直这样做
-
@AnttiHaapala:这里的措辞不清楚。 本身可以将
int类型分配给char,但如果int值可能在值之外,则通常不可以将int值分配给char可在char中表示,因为它不可移植(未完全由 C 标准定义,不会产生严格符合的代码,并且可能会陷入陷阱)。
标签: c char printf implicit-conversion integer-promotion