C语言数据存储与数据打印的奥秘

Posted 我想月薪过万

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言数据存储与数据打印的奥秘相关的知识,希望对你有一定的参考价值。

尊师: https://blog.csdn.net/yyywill

数据存储

要记住,在计算机中,数据都是以 二进制 来存储的,十六进制、八进制和十进制只是我们人为定义的一种表现形式。

数据打印

谈到数据打印,有人可能会说:不就是 printf() 吗?有啥难的。

面对着你的回答,我也只能 “哈哈” 一声。问道:printf() 原理你清楚吗?假如别人没有给你提供 printf() 函数,你该如何办?

我猜你现在肯定是懵逼状态。

不过别怕,下面我们来看看实际例子。

经典案例一

#include<stdio.h>
#include<stdlib.h>

int main(){
    char str[2] = {0x7f,0x80};
    int i;
    for ( i = 0; i < sizeof(str); i++)
    {
        printf("%02x ",str[i]);
    }
    printf("\\n");
}

 聪明的同学已经看出了端疑,我都存的是 char 类型,打印出来的结果怎么不一样了呢?

其实原因很简单:

所以,由上面的讲解可以看出,我们在 存数据打印数据 的时候最好使用 无符号的 char 类型,这样可以防止无端生出 一堆 f。

解决代码如下:

#include<stdio.h>
#include<stdlib.h>

int main(){
    unsigned char str[2] = {0x7f,0x80};
    int i;
    for ( i = 0; i < sizeof(str); i++)
    {
        printf("%02x ",str[i]);
    }
    printf("\\n");
}

亲手实现 printf()

方法一:对比数组法

#include<stdio.h>
#include<stdlib.h>

void self_printf(unsigned char value);

int main(){
    unsigned char str[2] = {0x7f,0x80};
    int i;
    for ( i = 0; i < sizeof(str); i++)
    {
        self_printf(str[i]);
        printf(" ");
    }
    printf("\\n");
}

//方式一
void self_printf(unsigned char value){
    unsigned char HEX[] = "0123456789ABCDEF";
    printf("%c",HEX[value>>4]);
    printf("%c",HEX[value&0x0f]);
}

方法二:差值法

#include<stdio.h>
#include<stdlib.h>

void self_printf(unsigned char* value);
void byte2str(unsigned char value);

int main(){
    unsigned char str[2] = {0x7f,0xef};
    int i;
    for ( i = 0; i < sizeof(str); i++)
    {
        self_printf(str+i);
        printf(" ");
    }
    printf("\\n");
}

//方式一
void self_printf(unsigned char* value){
    unsigned char tmp = 0;
    tmp = *value>>4;
    byte2str(tmp);
    tmp = *value&0x0f;
    byte2str(tmp);
    // printf("%c",HEX[*value>>4]);
    // printf("%c",HEX[*value&0x0f]);
}

void byte2str(unsigned char value){
    if (value <= 9)
    {
        printf("%c",0x30+value);
    }else
    {
        printf("%c",value-10+'A');
    }
}

以上是关于C语言数据存储与数据打印的奥秘的主要内容,如果未能解决你的问题,请参考以下文章

linux系统下,文件存储与数据读写问题(C语言)。

存储引擎 boltdb 的设计奥秘?

C语言中数组与指针的异同之处!你不知道的编程奥秘~

C语言%u%d打印的规则数据在内存中的存储及大小端存储模式

借汇编之力窥探String背后的数据结构奥秘

借汇编之力窥探String背后的数据结构奥秘