非printf形式打印各种数据类型的十六进制和二进制

本文提供了一段使用C++模板实现的代码,用于将long型数据转换为二进制和十六进制格式进行输出。包括对整型、浮点型和双精度型数据的转换示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、源码实现
为了适配各种数据类型,且可以通过sizeof得到此类型的大小,所以这里采用模板形式开发。

以下是实现此功能的源码:

 

[cpp]
// 把十进制数(long型)分别以二进制和十六进制形式输出  
template <typename T> 
void displayHexBin(const T& v) 

    const unsigned char c2h[] = "0123456789ABCDEF"; 
    const unsigned char c2b[] = "01"; 
 
    unsigned char* p = (unsigned char*)&v; 
    char* buf = new char [sizeof(T)*2+1]; 
     
    // 转为16进制  
    char* ptmp = buf; 
    p = p + sizeof(T)-1; 
    for (int i = 0; i < sizeof(T); i++, --p)  
    { 
        *buf++ = c2h[*p >> 4]; 
        *buf++ = c2h[*p & 0x0F]; 
    } 
    *buf = '\0'; 
    printf("hex format displayed as %s\n", ptmp); 
    delete [] ptmp; 
 
    // 转为2进制  
    p = (unsigned char*)&v; p = p + sizeof(T)-1; 
    ptmp = buf = new char [sizeof(T)*8+1]; 
    for (int i = 0; i < sizeof(T); i++, --p) 
    { 
        for (int j = 0; j < 8; j++) 
            *buf++ = c2b[(*p >> (7-j)) & 0x1]; 
    } 
    *buf = '\0'; 
    printf("bin format displayed as %s\n", ptmp); 
    delete [] ptmp; 

// 把十进制数(long型)分别以二进制和十六进制形式输出
template <typename T>
void displayHexBin(const T& v)
{
 const unsigned char c2h[] = "0123456789ABCDEF";
 const unsigned char c2b[] = "01";

 unsigned char* p = (unsigned char*)&v;
 char* buf = new char [sizeof(T)*2+1];
 
 // 转为16进制
 char* ptmp = buf;
 p = p + sizeof(T)-1;
 for (int i = 0; i < sizeof(T); i++, --p)
 {
  *buf++ = c2h[*p >> 4];
  *buf++ = c2h[*p & 0x0F];
 }
 *buf = '\0';
 printf("hex format displayed as %s\n", ptmp);
 delete [] ptmp;

 // 转为2进制
 p = (unsigned char*)&v; p = p + sizeof(T)-1;
 ptmp = buf = new char [sizeof(T)*8+1];
 for (int i = 0; i < sizeof(T); i++, --p)
 {
  for (int j = 0; j < 8; j++)
   *buf++ = c2b[(*p >> (7-j)) & 0x1];
 }
 *buf = '\0';
 printf("bin format displayed as %s\n", ptmp);
 delete [] ptmp;
}

 

 
二、框图解释
以上代码分为两部分,一个是转为16进制;一部分是转为2进制。

1、以Int为例求它的16进制数

 

 \

2、以Int为例求它的2  进制数


 

 三、 数据测试
 

 \

 1、Int 转16 进制与2进制
[cpp]
// 测试四.1   Int 转16 进制与2进制  
    int dSourceOne = 2; 
    int dSourceTwo = -2; 
    displayHexBin(dSourceOne); 
    displayHexBin(dSourceTwo); 
// 测试四.1   Int 转16 进制与2进制
 int dSourceOne = 2;
 int dSourceTwo = -2;
 displayHexBin(dSourceOne);
 displayHexBin(dSourceTwo);
结果:

 \

2、float 转16进制与2 进制
[cpp]
// 测试四.2   double 转16 进制与2进制  
    float fSourceOne = 3.0; 
    float fSourceTwo = -2.0; 
    displayHexBin(fSourceOne); 
    displayHexBin(fSourceTwo); 
    printf("\n"); 
// 测试四.2   double 转16 进制与2进制
 float fSourceOne = 3.0;
 float fSourceTwo = -2.0;
 displayHexBin(fSourceOne);
 displayHexBin(fSourceTwo);
 printf("\n");

 \

float类型的二进制的存放方式请参考我的另一篇文章: 浮点型数据在内存中存储的表示[转载]

 

3、double 转16 进制与2进制
[cpp]
// 测试四.3   double 转16 进制与2进制  
    double dSourceOne = 2.0; 
    double dSourceTwo = -2.0; 
    displayHexBin(dSourceOne); 
    displayHexBin(dSourceTwo); 
// 测试四.3   double 转16 进制与2进制
 double dSourceOne = 2.0;
 double dSourceTwo = -2.0;
 displayHexBin(dSourceOne);
 displayHexBin(dSourceTwo);

 \

 

 作者:chenyujing1234

### 如何使用 `printf` 函数打印十六进制数 在 C 语言中,可以利用 `printf` 的格式化输出功能来打印整数的十六进制表示。常用的格式说明符有 `%x` `%X`,分别用于以小写字母大写字母的形式显示十六进制数值[^1]。 以下是具体的实现方法: #### 打印正数的十六进制值 如果要打印一个正整数的十六进制形式,可以直接使用 `%x` 或 `%X` 格式说明符: ```c #include <stdio.h> int main(void) { int number = 0x1A2B; printf("Hexadecimal (lowercase): %#x\n", number); printf("Hexadecimal (uppercase): %#X\n", number); return 0; } ``` 运行结果将是: ``` Hexadecimal (lowercase): 0x1a2b Hexadecimal (uppercase): 0X1A2B ``` 这里使用的 `#` 标志会自动在输出前加上 `0x` 前缀(对于 `%x`)或者 `0X` 前缀(对于 `%X`),表明这是一个十六进制数[^3]。 #### 打印负数的十六进制值 由于十六进制本质上是无符号的,在处理负数时需要特别注意。直接使用 `%x` 可能不会显示出预期的结果,因此可以通过手动检测并调整的方式来正确展示负数的十六进制形式[^1]。 以下是一个完整的例子: ```c #include <stdio.h> #include <stdint.h> // 提供固定宽度类型的定义 #define DATA -0x123 int main(void) { int32_t data = DATA; if (data < 0) { printf("-"); data = -data; // 换为正值 } printf("%#x\n", data); return 0; } ``` 此程序首先判断输入的数据是否为负数,若是,则先打印减号 `-` 并将该数据取反后再进行换。 #### 浮点数的十六进制科学计数法输出 除了整型外,还可以通过特定的格式说明符 `%a` 来输出浮点数或双精度数的十六进制科学记数法表示[^2]。例如: ```c #include <stdio.h> int main(void) { double value = 123.456; printf("Float/Double as hexadecimal: %a\n", value); return 0; } ``` 这将会把给定的浮点数按照 IEEE 754 标准下的二进制到十进制化后的十六进制表达方式呈现出来[^2]。 ### 总结 以上介绍了几种不同情况下如何运用 `printf` 函数及其相应的格式控制符来完成对各种类型变量向十六进制形式的有效换与输出操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值