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语言数据存储与数据打印的奥秘的主要内容,如果未能解决你的问题,请参考以下文章