`
guhanjie
  • 浏览: 300503 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C语言中以十六进制输出字符型变量会出现'ffffff"的问题

 
阅读更多

最近在做一个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语言二进制字符串与十六进制字符串相互转化

    本文将深入探讨如何在C语言环境中实现二进制字符串与十六进制字符串之间的转换,并结合MFC(Microsoft Foundation Classes)框架创建一个小工具来辅助这些操作。 首先,让我们理解二进制和十六进制的基本概念。二...

    十六进制与字符串转换

    在C语言中,十六进制和字符串的转换主要涉及到以下函数: 1. **十六进制到字符串转换**: - `sprintf()`:这个标准库函数可以用来将数值转换为字符串。例如,如果你有一个整数`int num`,你可以使用`sprintf(hex...

    c语言中十六进制转二进制显示的实现方法

    //输出格式: hex2bin 5e. //得到: 0101 1110 //====================================== #include <stdio>#include char *bitstr(char *, void const *, size_t); int main(int argc, char **argv){ unsigned char...

    16进制转字符串

    本例中的代码是用C语言实现的一个十六进制到字符串的转换函数`hex_to_str`。下面对这段代码进行详细分析: ```c char* hex_to_str(char* dest, const uint8_t* src, uint8_t src_size) { uint8_t i, tmp_h, tmp_l;...

    C语言,实现进制转换,十进制转换为十六进制

    C语言,实现进制转换,十进制转换为十六进制 例如输入10,转换结果为a

    C语言进制转换,十进制转16进制

    在实际的C语言代码中,可以使用`while`或`for`循环来实现这个逻辑,并结合字符串操作函数如`strcat()`和`sprintf()`来构建最终的十六进制字符串。同时,为了处理负数,需要在转换前检查输入是否为负,并在结果前添加...

    单精度浮点数与十六进制转换_C语言程序

    例如,在通信协议中,将浮点数转换为十六进制字符串可以减少传输的数据量,同时保持足够的精度。此外,单片机的有限资源意味着优化数据表示和处理流程对于性能至关重要。 综上所述,理解和掌握单精度浮点数与十六...

    C语言实现十进制转十六进制

    在C语言中,我们可以利用内置的`printf`函数来格式化输出十六进制数值,但这里的任务是编程实现这个转换过程。以下是一种常见的方法: 1. **定义函数**:创建一个名为`dec_to_hex`的函数,接收一个十进制整数作为...

    浮点数与十六进制转换

    `%a`会输出浮点数的十六进制形式,包括一个小数点和一个后缀,如`%a`用于单精度浮点数,`%la`(或`%Lf`)用于长双精度浮点数。 转换过程大致如下: 1. 首先,浮点数的二进制表示被拆分为三个部分:符号、指数和...

    float类型的十六进制转换为十进制

    在计算机科学中,数据通常以二进制形式存储,但为了便于人类阅读和理解,我们经常需要将这些二进制数据转换成其他形式,比如十进制或十六进制。在MATLAB编程环境中,处理浮点数(如C语言中的`float`类型)的十六进制...

    C语言实现十六进制数据转十进制数据

    在计算机科学中,数据的表示方式多种多样,其中常见的有二进制、八进制、十进制和十六进制。十六进制由于其简洁性和易于人类理解的特点,在编程和计算机系统中广泛应用。本篇文章主要关注如何使用 C 语言将十六进制...

    十六进制转化为十进制(C编写,附代码)

    在计算机科学中,数据通常以不同的进制表示,如二进制、八进制、十进制和十六进制。十六进制(Hexadecimal)是一种广泛使用的数字系统,特别是在编程和计算机内存表示中,因为它可以简洁地表示二进制数。本篇文章将...

    stm32十六进制字符串转十进制数值代码

    在STM32项目中,你可能需要将接收到的串口数据(通常以十六进制字符串形式)转换为十进制数值,以便进行计算或者比较。例如,如果你有一个传感器发送的十六进制温度值,你可以用上述函数将其转换为十进制,再进行...

    c语言实现十进制到十六进制的转换和对带有括号和小数点的数学表式的数值计算

    在C语言编程中,十进制到十六进制的转换和数学表达式的计算是常见的任务,特别是对于初学者来说,掌握这些技能对于深入理解计算机工作原理至关重要。本篇将详细探讨这两个主题,以及如何利用链栈来辅助实现。 首先...

    C语言中十六进制转十进制两种实现方法

    在C语言中,将十六进制数转换为十进制数是常见的编程任务,尤其是在处理数据转换或解析十六进制字符串时。以下是两种不同的实现方法,它们都可以有效地完成这一转换。 **方法一** 该方法首先读取用户输入的十六...

    javaScript实现浮点数转十六进制字符

    在JavaScript中,可以使用内置函数 parseInt() 来将十六进制字符串转换为十进制整数,使用 toString(16) 方法将十进制整数转换为十六进制字符串。 4. 浮点数转换为十六进制的JavaScript实现方法: 根据上述内容,...

    C语言16 转10进制

    标题中的“C语言16转10进制”指的是使用C语言编程将十六进制(16进制)数值转换为十进制(10进制)。十六进制是一种广泛使用的数字系统,在计算机科学中尤其常见,因为它可以方便地表示二进制数据。而C语言是一种...

    C语言十到十六进制转化

    才语言编写的十进制到十六进制的转化问题,提供具体的源代码,可供下载

    JPG图片转化成十六进制数据的程序

    转换后的十六进制字符串会被写入TXT文件,形成一连串的十六进制数据,如“FF D8 FF D9”,这些都是JPEG文件的特定标识符,分别代表JPEG的起始和结束标记。 十六进制表示法在处理二进制数据时非常有用,因为它提供了...

Global site tag (gtag.js) - Google Analytics