c语言ffffff错误,C语言打印16进制出现0xffffff现象的问题剖析!
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现象的问题剖析!相关推荐
- [工具]-C语言中字符串的形式打印16进制数据
C语言中字符串的形式打印16进制数据. 这样写,输出更直观些 #define PRINT_BUF_MAX (32) #define TAG_STRING_MAX (32) static void pr ...
- C语言快速互转HEX(16进制)和原始字符串/数组
C语言快速互转HEX(16进制)和原始字符串/数组 缘由 这个起因是昨晚群里有人在讨论怎么把字符串转成HEX方法最佳,讨论到最后变成哪种方法效率最优了.毕竟这代码是要在MCU上面跑的,要同时考虑到时间 ...
- C语言(JS)浮点、16进制相互转换
文章目录 前言 一.float转16进制(可用于C语言) 二.16进制转float(可用于C语言) 三.16进制转float(可用于JS.C语言方法3) 总结 前言 处理Modbus协议float转1 ...
- c语言16进制数给变量,C语言中怎样定义能够保存16进制整数的变量
Objective-C中NSInvocation的使用 OC中调用方法某个对象的消息呦两种方式: #1. performanceSelector: withObject: #2. NSInvocati ...
- C语言把256位二进制转为16进制
需求: 有256点数据,每个点有两个取值范围,0表示黑色,1表示白色,然后要把这256个点打包成32个BYTE. void make_data_package(char buff[] , long o ...
- java 打印16进制数组_如何在Java中将字节数组转换为十六进制字符串?
从这里的讨论,特别是这个答案,这是我目前使用的功能:private final static char[] hexArray = "0123456789ABCDEF".toChar ...
- C语言 将16进制转换成10进制输出
大家好!今天来打印16进制转换成10进制输出,16进制前面是0x.这里以打印ABCDEF的10进制为例 如下: 希望有所启发!!!^__^ 大雨落幽燕,白浪滔天,秦皇岛外打鱼船. ---------- ...
- 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 如何将 ...
- 如何将整数输出为16进制,且输出的字母大写
C语言如何将整数输出为16进制, 且输出的字母大写 C语言如何将整数输出为16进制,且输出的字母大写 代码如图 解释 C语言如何将整数输出为16进制,且输出的字母大写 案例:请输出十进制整数1234对 ...
最新文章
- 真正毁掉一个人的,是“打工者心态”
- Confluence 6 有关空间的一些提示
- 1秒识别200个假大牌 成本降50% 清华阿里邀全国人才用20张图锻造“打假AI”
- [转帖]迎战AMD 7nm 64核EPYC 英特尔至强也玩起了胶水以及性价比
- 2019ICPC(南昌) - Hello 2019(动态规划+线段树维护矩阵)
- 10个节省时间和改善工作流的Git技巧
- “Zhuang.Data”轻型数据库访问框架(一)开篇介绍
- Python面试题(二)列表去重,单例
- C++中关于隐藏的理解
- webstorm plugins emmet
- Bootstrap 模态框(Modal)
- C++程序设计随笔(二)
- 空巢青年,“空巢”是选择还是无奈? | 数据告诉你
- 最简单!阿里云服务器采用 LNMP一键安装包 配置 Linux+Nginx+Mysql+PHP
- MATLAB绘制三维地图
- java isbn_ISBN(国际标准书号)的校验
- 《大清重臣李鸿章·上下》—— 读后总结
- centos7 开机自动启动程序
- html整体页面灰色,让网页整体变灰的方法
- 【Vmware】打开虚拟机时提示“无法连接虚拟设备,因为主机上没有响应的设备”
热门文章
- CSP认证201809-2	买菜[C++题解]:区间覆盖、pair、交集长度、右端点的min-左端点的max
- 算法提高课-图论-单源最短路的建图方式-AcWing 1126. 最小花费:dijkstra求最长路
- python报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode解决方案
- Win10 使用minikube搭建k8s集群 并运行hello-minikube实例
- netcore更新dll要停止_使 .NET Core 应用程序容器化
- php调用其它控制器,TP框架控制器里面怎么调用另一个控制器的代码
- 网络缓存 峰值 linux,Linux Page Cache调优在Kafka中的应用
- 海思芯片对比选型_海思芯片的选型及特征参考说明大全
- bazel 链接第三方动态库_C语言学习篇(31)——linux中制作动态链接库
- html百度地图中心点不正确,百度地图嵌入弹出层,无法准确正确显示marker标记到中心位置的问题...