C语言打印16进制出现0xffffff现象的问题剖析!

其实类似的问题不是只在网络程序中才会出现的,看示例代码:

复制代码

1 #include

2 int main()

3 {

4     char c = 0xc9;

5     printf("A:c = %2x\n",(unsigned char)c);

6     printf("B:c = %2x\n",c & 0xff);

7     printf("C:c = %2x\n",c);

8     return 0;

9 }

复制代码

程序输出如下:

A:c = c9

B:c = c9

C:c = ffffffc9

可以看到:

把c转换成unsigned char打印是正确的。视作情况A。

把c与 0xff做&操作后打印正确。视作情况B。

对c不做任何处理,则问题复现了,打印出ffffffc9。视作情况C。

情况A B是我百度来的一些解决C现象的方法。那么我们现在来逐一分析解释ABC三种情况。

首先我们必须知道,printf()函数的%x(X)输出的是Int型别的16进制格式。所以char型别的c变量会被转换成Int型别。

其次,我们的知道计算机是用补码表示数据的。关于原码,反码,补码的知识请自行充电。

情况C:

c的补码:11001001(0xc9)。

c的反码:11001000(0xc9)。

c的原码:10110111(0xc9)。

因为char型别是带符号的,所以最高位的1这里视为负号。

把c转换成Int型别   char  -----> Int

Int_c的原码:10000000 00000000 00000000 00110111(把c原码的最高位1  提到最高位。其余高位补0)。

Int_c的反码:11111111 11111111 11111111 11001000

Int_c的补码:11111111 11111111 11111111 11001001(0xffffffc9)。

所以打印出来看似诡异的值其实是合情合理的。如何避免?看AB情况。

情况B:

我们在情况C的基础上将c与0xff做&操作。

Int_c的补码:11111111 11111111 11111111 11001001(0xffffffc9)。

&

00000000 00000000 00000000 11111111

最终结果为: 00000000 00000000 00000000 11001001(0xc9)。

情况A:

我觉得情况A的处理方式才是最正规的处理办法,但是据说linux内核使用(&0xff)。

c的补码:11001001(0xc9)。

c的反码:11001001(0xc9)。

c的原码:11001001(0xc9)。

这里强制转换c为unsigned char型别。因此最高位的1不是正负号

把c转换成Int型别   char  -----> Int

Int_c的原码:00000000 00000000 00000000 11001001(把c原码的最高位1  提到最高位。其余高位补0)。

Int_c的反码:00000000 00000000 00000000 11001001

Int_c的补码:00000000 00000000 00000000 11001001(0xc9)。

因此打印正常。

以上分析,如有不正确的地方请各位指正。

http://www.dengb.com/Cyy/1052695.htmlwww.dengb.comtruehttp://www.dengb.com/Cyy/1052695.htmlTechArticleC语言打印16进制出现0xffffff现象的问题剖析! 其实类似的问题不是只在网络程序中才会出现的,看示例代码: 复制代码 1 #include stdio.h 2 i...

c语言ffffff错误,C语言打印16进制出现0xffffff现象的问题剖析!相关推荐

  1. [工具]-C语言中字符串的形式打印16进制数据

    C语言中字符串的形式打印16进制数据. 这样写,输出更直观些 #define PRINT_BUF_MAX (32) #define TAG_STRING_MAX (32) static void pr ...

  2. C语言快速互转HEX(16进制)和原始字符串/数组

    C语言快速互转HEX(16进制)和原始字符串/数组 缘由 这个起因是昨晚群里有人在讨论怎么把字符串转成HEX方法最佳,讨论到最后变成哪种方法效率最优了.毕竟这代码是要在MCU上面跑的,要同时考虑到时间 ...

  3. C语言(JS)浮点、16进制相互转换

    文章目录 前言 一.float转16进制(可用于C语言) 二.16进制转float(可用于C语言) 三.16进制转float(可用于JS.C语言方法3) 总结 前言 处理Modbus协议float转1 ...

  4. c语言16进制数给变量,C语言中怎样定义能够保存16进制整数的变量

    Objective-C中NSInvocation的使用 OC中调用方法某个对象的消息呦两种方式: #1. performanceSelector: withObject: #2. NSInvocati ...

  5. C语言把256位二进制转为16进制

    需求: 有256点数据,每个点有两个取值范围,0表示黑色,1表示白色,然后要把这256个点打包成32个BYTE. void make_data_package(char buff[] , long o ...

  6. java 打印16进制数组_如何在Java中将字节数组转换为十六进制字符串?

    从这里的讨论,特别是这个答案,这是我目前使用的功能:private final static char[] hexArray = "0123456789ABCDEF".toChar ...

  7. C语言 将16进制转换成10进制输出

    大家好!今天来打印16进制转换成10进制输出,16进制前面是0x.这里以打印ABCDEF的10进制为例 如下: 希望有所启发!!!^__^ 大雨落幽燕,白浪滔天,秦皇岛外打鱼船. ---------- ...

  8. html rgb 16进制转换,rgb转16进制 rgb对应的16进制是多少

    c++如何将RGB(230,230,230)转换成0x十六进制 移位和按位加: int r,g,b; int c; // TC 用 long int; // 如果次序是RRGGBB c = r 如何将 ...

  9. 如何将整数输出为16进制,且输出的字母大写

    C语言如何将整数输出为16进制, 且输出的字母大写 C语言如何将整数输出为16进制,且输出的字母大写 代码如图 解释 C语言如何将整数输出为16进制,且输出的字母大写 案例:请输出十进制整数1234对 ...

最新文章

  1. 真正毁掉一个人的,是“打工者心态”
  2. Confluence 6 有关空间的一些提示
  3. 1秒识别200个假大牌 成本降50%  清华阿里邀全国人才用20张图锻造“打假AI”
  4. [转帖]迎战AMD 7nm 64核EPYC 英特尔至强也玩起了胶水以及性价比
  5. 2019ICPC(南昌) - Hello 2019(动态规划+线段树维护矩阵)
  6. 10个节省时间和改善工作流的Git技巧
  7. “Zhuang.Data”轻型数据库访问框架(一)开篇介绍
  8. Python面试题(二)列表去重,单例
  9. C++中关于隐藏的理解
  10. webstorm plugins emmet
  11. Bootstrap 模态框(Modal)
  12. C++程序设计随笔(二)
  13. 空巢青年,“空巢”是选择还是无奈? | 数据告诉你
  14. 最简单!阿里云服务器采用 LNMP一键安装包 配置 Linux+Nginx+Mysql+PHP
  15. MATLAB绘制三维地图
  16. java isbn_ISBN(国际标准书号)的校验
  17. 《大清重臣李鸿章·上下》—— 读后总结
  18. centos7 开机自动启动程序
  19. html整体页面灰色,让网页整体变灰的方法
  20. 【Vmware】打开虚拟机时提示“无法连接虚拟设备,因为主机上没有响应的设备”

热门文章

  1. CSP认证201809-2 买菜[C++题解]:区间覆盖、pair、交集长度、右端点的min-左端点的max
  2. 算法提高课-图论-单源最短路的建图方式-AcWing 1126. 最小花费:dijkstra求最长路
  3. python报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode解决方案
  4. Win10 使用minikube搭建k8s集群 并运行hello-minikube实例
  5. netcore更新dll要停止_使 .NET Core 应用程序容器化
  6. php调用其它控制器,TP框架控制器里面怎么调用另一个控制器的代码
  7. 网络缓存 峰值 linux,Linux Page Cache调优在Kafka中的应用
  8. 海思芯片对比选型_海思芯片的选型及特征参考说明大全
  9. bazel 链接第三方动态库_C语言学习篇(31)——linux中制作动态链接库
  10. html百度地图中心点不正确,百度地图嵌入弹出层,无法准确正确显示marker标记到中心位置的问题...