(转)C语言16进制输出字符型变量问题
最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下:
- char buf[10] = {0};
- buf[0] = 0xbf;
- printf("%2x\n\n\n", buf[0]); /*在终端将会显示成:ffffffbf*/
- buf[1] = 0x7f;
- printf("%2x\n\n\n", buf[1]); /*在终端将会显示成:7f*/
为什么buf[0]不像buf[1]显示的那样,显示2个十六进制数bf呢?
研究发现,只要字符型变量值的二进制第一位是1,就会如buf[0]所显示的那样,出现6个f。
而格式输出函数printf中会对所输出的变量做有符号/无符号型的判断。如果是有符号型变量,且该值二进制首位为1(如我们定义的是char buf[100],且buf[0]中为0xbf),则会按照补码形式前面全置为1,也就是全为f。(因为终端显示的是8个十六机制数字;另外,我用Tobor C编译,因为Tobor C中int是2bytes,终端显示就成4个十六进制数字了:ffbf,因此我猜测,printf函数显示之前先将有符号型值转换成了一个4bytes的int。当然,这是函数内部的处理,跟我们所说的话题关系不大。)。
按照上面述说的,如果把buf声明为unsigned char型,则显示会变成:bf
而且,如果程序需要讲一个有符号型的变量以十六进制形式输出,且只显示两位,可以强制类型转换为无符号型变量,如上面的buf[0],可以转换成:(unsigned char)buf[0]
此外,如果有人这样来测试这个问题,
- printf("%2x\n\n\n", 0xbf); /*在终端将会显示成:bf*/
为什么这边没有6个f呢?因为,printf()函数第二个参数直接以int型来接收,int型变量4bytes,二进制首位自然为0,因此不会显示多个f。
原文http://guhanjie.iteye.com/blog/1765585
(转)C语言16进制输出字符型变量问题的更多相关文章
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char ...
- 基于visual Studio2013解决面试题之1203转16进制输出
题目
- C printf按8进制、10进制、16进制输出以及高位补0
; /*按整型输出,默认右对齐*/ printf("%d\n",PrintVal); /*按整型输出,补齐4位的宽度,补齐位为空格,默认右对齐*/ printf("%4d ...
- python - 2 8 16进制/颜色/字符编码
1.二进制 八进制 十六进制 二进制: bin() 0b10010八进制: oct() 0o10十进制: 1-100十六进制: hex() 0X53 BH 十进制转2, 8,16进制: >> ...
- C语言 16进制与ascii码互转
/*把ASCII字符转换为16进制 */ uint8_t char_to_hex(const uint8_t *ch) { uint8_t value = 0; if(*ch >= 0 & ...
- Go -- socket read的内容以16进制输出
buf := make([]) reqLen, err := conn.Read(buf) // 遍历, 转为16进制 buffer := new(bytes.Buffer) for _, b := ...
- C语言各种进制输出
#include<stdio.h> int main() { ; float f = 12.0; printf("十进制输出:%d\n", number); print ...
- byte数组转16进制 输出到文件
try { File file = new File(Environment.getExternalStorageDirectory(),"shuju2"); if(!file.e ...
- C语言 16进制转float
float hex_to_float(uint8_t *data) { float num = 0.0; uint8_t dd[4] = {data[0], data[1], data[2], dat ...
随机推荐
- linux 学习15 16 启动管理,备份和恢复
第十五讲 启动管理 . CentOS .x 启动管理 //此处指6.3 系统运行级别 .运行级别 运行级别 含 义 关机 单用户模式,可以想象为windows的安全模式,主要用于系统修复 //linu ...
- DGV换行操作
DGV.RowsDefaultCellStyle.WrapMode = DataGridViewTriState.True;
- (转载)iOS 极光推送SDK 集成指南
iOS SDK 集成指南 使用提示 本文匹配的 SDK版本:r1.2.5 以后. 查看最近更新了解最新的SDK更新情况. 产品功能说明 极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能 ...
- WinForm添加快捷键
1. WinForm下给窗体和按钮添加快捷键 设置Enter键要执行的动作:设置FORM的 AcceptButton属性为指定的button按钮. 设置ESC键要执行的动作:设置FORM的Cac ...
- 大毕设-MATLAB-FFT实现
引用来自:http://blog.csdn.net/sinwel/article/details/8115673 %仿真参数中的含义 % Ts 表示间隔Ts时间采样,这个越小越接近连续信号,而实际上不 ...
- cdnbest节点安装后连不上主控常见问题
1. 查看节点程序是否启动 ps -aux |grep kangle 2. 如果节点程序都有启动,可查看日志,节点连接的是不是你帐号的uid帐号或者是否有其他报错信息 tail -f /var/log ...
- Python——函数中的关键字参数
关键字参数 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple.而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict.请看 ...
- 安卓开发 想要获取某个View的高度(我是在做滚动浮层的时候用到的)
1.activity中有个onWindowFocusChanged()方法,可以获取控件的大小,别的地方可能会调用过早导致获取不到实际的大小 @Override public void onWindo ...
- Textrank算法介绍
先说一下自动文摘的方法.自动文摘(Automatic Summarization)的方法主要有两种:Extraction和Abstraction.其中Extraction是抽取式自动文摘方法,通过提取 ...
- Java中List,ArrayList、Vector,map,HashTable,HashMap区别用法
Java中List,ArrayList.Vector,map,HashTable,HashMap区别用法 标签: vectorhashmaplistjavaiteratorinteger ArrayL ...