char、unsigned char与字面值比较的相关问题

最近做一个项目,定义了一个char数组,里面存放别人发送过来的消息。定义的消息头是0xff0xff,所以我收到消息后就与0xff进行比较,结果却发现不相等。看了一些资料,发现还是自己对基础知识的掌握不到位。

首先,我写了个测试程序,代码及运行结果如下:

           void test_num()
          {
               char a = 0x01;
               char b = 0xfe;
               unsigned char c = 0xfe;
               printf("a=%02x\n",a);
               printf("b=%02x\n",b);
               printf("c=%02x\n",c);
               printf("fe=%02x\n",0xfe);
               printf("(char)fe=%02x\n",(char)0xfe);
               printf("-1=%02x\n",-1);
               if( a == 0x01)
                   cout<<"a == 0x01"<<endl;
               if( b == 0xfe)
                  cout<<"b == 0xfe"<<endl;
               if( b == (char)0xfe)
                  cout<<"b == (char)0xfe"<<endl;
               if( c == 0xfe)
                  cout<<"c == 0xfe"<<endl;
               if( 255 == 0xff)
                  cout<<"255 == 0xff"<<endl;
               if( -1 == 0xff)
                  cout<<"-1 == 0xff"<<endl;
               if( -1 == 0xffffffff)
                  cout<<"-1 == 0xffffffff"<<endl;
        }

执行结果如下:

       

分析:print 02x打印的是int值,现在我们传递的都是char类型,所以首先就存在着类型转换。char是8位的,大部分系统下int是32位的,所以首先需要补24位的数据。那数据应该补什么呢,实际上是看这个变量的正负情况的,正数则补0,负数补1.这个具体可以参考

https://blog.csdn.net/qq_39165336/article/details/78383239,此文对此进行了详细的测试。

后面进行的==判断,一边是char类型,一边是字面值常量。那这个字面值常量是什么类型呢?经查询相关文档得知字面值常量是int、unsigned int、long、unsigned long、long long、unsigned long long的较小值。所以前面几个都是char和int进行比较,这就涉及到刚刚说过的类型转换。最后一个字面值常量是unsigned int,所以需要将char转换为unsigned int,在扩展符号位之后将其理解为一个正数,实际上也就是取模。最终显示他们是相等。

最后说一句,如果我们是想存一个字符串,可以定义一个char数组,如果只是想开辟一个内存保存一些二进制数据,最好定义为unsigned char。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值