`
SmartGeek
  • 浏览: 71648 次
  • 来自: 南京
社区版块
存档分类

[C 语言] 字符型的16进制输出

阅读更多

问题:将一个字符类型按16进制输出,输出格式为0xab, 0x后面要求是2位,不够2位则补0,比如“0x0b”。

常见的错误做法是:

#include <stdio.h>
int main()
{
    char a = 0x41; // a = 'A'
    printf( "the hex value of a is 0x%02x\n", a );
    return 0;
}

 貌似正确,但是如果a = 0xf1,上面的输出将是 0xfffffff1 而不是 0xf1。

 

究其原因,%x 是 unsigned int  或  int  型输出 ,所以 printf("%x", a) 在执行时将自动将 a 类型提升(char 将提升至 int;unsigned char 将提升至 unsigned int), 注意到 char 是 signed(有符号的),如果这时 a 是负数 ,在提升的时候前面将会补1 ,即象反例中的 0xf1 => 0xfffffff1;而unsigned char 在提升的时候只会补0。

 

解决的办法有三:

方法1. 强制类型转换

#include <stdio.h>
int main()
{
    char a = 0xf1;
    printf( "the hex value of a is 0x%02x\n", (unsigned char)a );
    return 0;
}

但是上面的例子不能写成 (unsigned int)a 或者 (unsigned short)a。这又涉及到类型隐式转换的过程,举例来说:

当 a 是 char,(unsigned int)a 提升的过程:
char => int
int => unsigned int

 

方法2. 精确打印格式

#include <stdio.h>
int main()
{
    char a = 0xf1;
    printf( "the hex value of a is 0x%02hhx\n", a );
    return 0;
}

其中 hh 将会将 int 转化成 char;unsigned int 转化成 unsigned char。具体可以 man 3 printf 查看详情。

hh     A following integer conversion corresponds to a signed char or unsigned char argument, or a following n conversion corresponds to a pointer to a signed char argument.

注意:printf format 格式与平台相关( linux 中的 printf 在 glibc 中实现 ),方法2在 VC 并不能通过。

 

方法3. 强制位数为 1 byte

#include <stdio.h>
int main()
{
    char a = 0xf1;
    printf( "the hex value of a is 0x%02x\n", (a&0xff) );
    return 0;
}

上面隐含过程是:先将 char a 提升至 int,然后再与 0xff 相与。

 

 

分享到:
评论

相关推荐

    16进制数据与浮点型数据转换——c语言程序

    在IT领域,尤其是在编程中,数据的...总结来说,这个“16进制数据与浮点型数据转换——C语言程序”提供了理解和操作不同数据类型之间转换的基础,对于深入学习计算机底层工作原理以及进行相关开发工作具有重要意义。

    浮点数与十六进制转换

    在C语言中,你可以使用以下代码片段将浮点数转换为16进制: ```c #include int main() { float f = 123.45f; printf("Float in hexadecimal: %a\n", f); return 0; } ``` 运行这段代码,你会看到`123.45f`的...

    BCD.rar_16进制_16进制转BCD_bcd 16进制_visual c_压缩BCD

    在给定的"16进制转压缩型BCD码的C语言实现"主题中,我们关注的是如何将16进制数转换为压缩型BCD码。C语言是一种底层编程语言,适合进行这样的数值转换操作。在这个过程中,我们需要了解如何解析16进制字符串,并将其...

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

    这个过程体现了在JavaScript中模拟C语言浮点数转换为十六进制的操作,其中虽然JavaScript语言本身没有直接支持这样的操作,但通过编写特定的算法和函数,仍然可以完成这个转换。由于JavaScript在Web开发中应用广泛,...

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

    1. **十六进制字符串到二进制字符串**:首先,程序需要将输入的十六进制字符串转换为对应的二进制字符串。MATLAB提供了一个名为`hex2bin`的函数,可以实现这一转换。 2. **分离符号、指数和尾数**:接着,程序会...

    十六进制转浮点数,十六进制转浮点数在线,LabView

    使用这个VI时,你需要将16进制的字符串输入到VI中,VI会输出相应的浮点数。如果你需要查看或修改这个VI的工作原理,可以打开它来查看前面板和程序框图,理解其内部逻辑。 总的来说,理解和掌握十六进制到浮点数的...

    十六进制字符串和数值相互转换

    在计算机科学中,十六进制(Hexadecimal)是一种逢16进1的进位制,通常用于表示二进制数据,因为它的每一位可以表示4位二进制,使得表示二进制数字更加简洁。十六进制字符串是用十六进制数字(0-9和A-F)组成的字符...

    C语言格式化输出详细说明

    - **格式符使用**:对于字符类型,推荐使用 `%c` 格式符进行输入输出;对于整型数据,可以使用 `%d`(带符号十进制)、`%o`(无符号八进制)或 `%x`(无符号十六进制)等格式符。 - **编译器差异**:不同的编译器...

    Python语言基础:输入和输出.pptx

    这将分别输出16进制和8进制的`a`的值。 除了百分比符号`%`的格式化,Python3还引入了新的格式化方式,如`format()`函数和f-string,不过这些不在当前的`input()`和`print()`的讨论范围内。 课堂作业: - 输入...

    格C/C++语言式化字符串

    在实际应用中,例如从串口接收单片机发送的16进制数据时,可以使用`sprintf`函数将接收到的字节转化为16进制字符串,如示例所示。这通过在循环中使用`%02x`格式化规定符,确保每个字节都以两位的十六进制数形式输出...

    C语言程序设计习题集及答案

    14. C 语言中 printf 函数可以输出多种类型的数据,包括整型、浮点型、字符型等(未出现)。 15. C 语言中 scanf 函数可以输入多种类型的数据,包括整型、浮点型、字符型等(未出现)。 指针和数组 16. C 语言中...

    【STC15系列】SYK-0806-A2S1- 15-串口收发十六进制数.rar

    例如,在C语言中,可以使用`printf`和`scanf`函数来方便地处理十六进制数的输出和输入。在发送十六进制数时,可以使用`sprintf`将数值转换为十六进制字符串,然后逐字符发送;接收时,通过循环读取单个字符并转换回...

    C语言练习题谭浩强第四版.附有答案.doc

    C 语言中,整型和字符型可以用八进制表示。因此,选项 A“字符型、整型”是正确的。 8. 选择题 8:C 语言的字符常数 C 语言的字符常数可以是ASCII 码值或转义序列。因此,选项 A“’\97’”和选项 C“’\t’”都是...

    浮点数-十六进制数相互转换工具

    十六进制数(Hexadecimal Number)则是基于16个符号(0-9和A-F)的计数系统,每四位二进制对应一个十六进制位。它常用于编程和计算机内存表示,因为它的基数大,可以更简洁地表示二进制数字。 转换工具的作用在于...

    ABAP程序设计基础

    2. 非完整型:需要指定长度的类型,如c(字符型,需要指定长度,默认为一字节)、n(数字型)、p(压缩数,可以是整数或带有小数部分)和x(16进制字符型)。 - c: 字符型,必须指定长度,范围1到65535字符。 - n:...

    C语言的数据类型与格式控制

    在输出时,使用格式符%c可以将 char 型数据输出为字符方式,也可以使用%d、%u、%x/%X、%o 将其输出为整数方式。 需要注意的是,char 型数据长度不一定为 1 字节,char 也不一定为有符号型,并不是所有编译器都这样...

    C语言各种对照表,初学者的必备

    C 语言中有多种输出格式控制符,每种控制符都有其特定的功能。下面是 C 语言中输出格式控制符对照表: 1. %d:输出有符号的十进制整数。 2. %u:输出无符号的十进制整数。 3. %f:输出 float 类型的浮点数。 4. %lf...

    中科大c语言机试题库及答案

    根据给定的信息,我们可以从这份中科大C语言机试题库及答案中提炼出一系列重要的C语言知识点。这些知识点不仅适用于准备考研复试的学生,对于所有希望深入理解C语言的编程人员也非常有用。以下是针对题目中提到的...

    C语言基础知识大全

    - 字符变量`char`类型,一个字符变量在内存中占一个字节,字符型数据与整型数据之间可以通用。 - 字符串常量: 以双引号括起的一串字符,如"how are you",不能直接赋值给字符变量,需要使用字符数组。 4. 变量...

    c语言学习总结.docx

    8. 字符型变量:可以用 char ch=’a’ 创建字符型变量,字符型变量占用内存空间大小可以用 Cout”字符型变量所占内存大小(char); 输出。 9. 转义字符:包括 \n 换行、\\ 反斜杠、\t 水平制表符等。 10. 字符串:...

Global site tag (gtag.js) - Google Analytics