c语⾔输出16进制数转字符,(转)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。
C语⾔中以⼗六进制输出字符型变量会出现'ffffff";的问题
最近在做⼀个C的嵌⼊式项⽬,发现在C语⾔中⽤printf()函数打印字符型变量时,如果想采⽤"%x"的格式将字符型变量值以⼗六进制形式打印出来,会出现⼀个⼩问题,如下: char ...
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 int main() { ; float f = 12.0; printf("⼗进制输出:%d\n", number); print ...
byte数组转16进制 输出到⽂件
try { File file = new ExternalStorageDirectory(),"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 ...
随机推荐
springmvc中RequestMapping的解析
在研究源码的时候,我们应该从最⾼层来看,所以我们先看这个接⼝的定义: package org.springframework.web.servlet; import
printf怎么输出字符javax.servlet.htt ...
Minimum Adjustment Cost
Given an integer array, adjust each integers so that the difference of every adjacent integers are n ...
Java基础(32):String与StringBuilder、StringBuffer的区别(String类)
在Java中,除了可以使⽤ String 类来存储字符串,还可以使⽤ StringBuilder 类或 StringBuffer 类存储字符串,那么它们之间有什么区别呢? String 类具有是不可变 ...
Django⽹站直接使⽤supervisor部署
python manage.py createsuperuser python manage.py migrate ⽣成⽹站的supervisor配置⽂件: echo_supervisord_conf ...
javascript预编译
刚学前端的⼩⽩,第⼀次写博客,难免有点幼稚.以后每周写两次博客,慢慢积累. 笨鸟不必先飞,但⼀定是最后⼀个留下的.加油! JS的预编译定义在⼀段程序执⾏前,js会把var和function这两个关键 ...
log4j的⽤法
1.导⼊
2.在src下新建log4j.properties,内容如下 Logger=DEBUG, A1 ,R log4j.appender.A1=org.apache.log4j ...
双向链表--Java实现
/*双向链表特点: *1.每个节点含有两个引⽤,previos和next,⽀持向前或向后的遍历(除头节点) *2.缺点插⼊或删除的时候涉及到引⽤修改的⽐较多 *注意:下⾯的双向链表其实也实现了双端链表 ...
2017-06-27(useradd usermod userdel 禁⽌普通⽤户登录)
useradd useradd -g 组名 ⽤户名 (添加新⽤户,并将其添加到指定的主⽤户组) useradd -g 组名 -G 附属组名 ⽤户名 (添加新⽤户,并将其添加⾄指定主⽤ ...
使⽤java操作elasticsearch(1)
1.安装elasticsearch 这⼉⽤的是5.6.9的版本,下载安装过程较为简单,在官⽹上下载好后解压到⽂件夹.需要注意的是在elasticsearch-
5.6.9\config下的elastic ...
把1,2,3…n*n 的数字按照顺时针螺旋的形式填⼊数字矩阵
从键盘输⼊⼀个整数(1~20)则以该数字为矩阵的⼤⼩,把1,2,3…n*n 的数字按照顺时针螺旋的形式填⼊其中.例如:输⼊数字2,则程序输出:1 24 3输⼊数字3,则程序输出:1 2 38 9 47 ...
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论