int to char cast,奇怪的行为

马西斯·布罗西耶(Mathis Brossier)

考虑以下:

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 ????

我知道,不应将分配intchar无论如何,看看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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有INT和单个连字符(-)的奇怪CAST行为

来自分类Dev

带有INT和单个连字符(-)的奇怪CAST行为

来自分类Dev

手动将char转换为int-奇怪的行为

来自分类Dev

Java从int转换为char代理奇怪

来自分类Dev

char *返回类型的行为很奇怪

来自分类Dev

如果要将char提升为int,应该使用static_cast <int>(char变量)还是+(char变量),为什么?

来自分类Dev

long int转换为char:C中的奇怪输出

来自分类Dev

奇怪的未签名char * concat行为

来自分类Dev

使用 char* 时的 C 奇怪行为

来自分类Dev

C将char数组转换为行为怪异的int

来自分类Dev

是否可以保证std :: char_traits <char> :: to_int_type(c)== static_cast <int>(c)?

来自分类Dev

C ++ float和int除法奇怪的行为

来自分类Dev

从float到int的转换(奇怪的行为)

来自分类Dev

奇怪的unsigned long long int行为

来自分类Dev

结构体中int的奇怪行为

来自分类Dev

在Java中将-ve int / -ve int相除的奇怪行为

来自分类Dev

从char转换为int

来自分类Dev

从char到int的加密

来自分类Dev

从 char * 转换为 int

来自分类Dev

C++ char* 与 int*

来自分类Dev

解散 int/char 数组

来自分类Dev

比较 int 和 char

来自分类Dev

从文件向未签名的char变量赋值的奇怪行为

来自分类Dev

取消引用char *时出现奇怪的数组/指针行为

来自分类Dev

const_cast的奇怪行为

来自分类Dev

从int转换为char失败,并且控制台打印出奇怪的符号

来自分类Dev

char 和 int 的总和导致我的 C++ 代码中出现奇怪的字符

来自分类Dev

无论是正数还是负数,通过char *缓冲区读取int的行为都不同

来自分类Dev

Why does -Wcast-align not warn about cast from char* to int* on x86?

Related 相关文章

热门标签

归档