c语言存储编码,C语言实型数据的编码和存储

C语言程序设计

2007年10月第23卷第5期皖西学院学报

JournalofWestAnhuiUniversityOct.,2007Vol.23 NO.5

C语言实型数据的编码和存储

周恒忠

(皖西学院计算机科学与技术系,摘 要:C语言数据类型丰富,,究。在TurboC2.0中,float型,编码长度分别为4B、8B和10B,从左至右,第一位,,、11b和15b,剩余部分为尾数的编码。存储时以字节为单位将编码逆序存放。,在实验的基础上归纳出了实型数据的相关属性。

关键词:C语言;实型;编码;存储。

中图分类号:TP312C   文献标识码:A    文章编号:1009-9735(2007)05-0019-03

3

引 言

数据类型是程序设计语言的重要概念,在各种C

语言的相关资料中,对于实型数据的介绍不如字符型数据和整型数据详细,且说法不一,甚至存在错误,特别是其编码和存储。笔者经过实验和研究,归纳出在TurboC2.0环境中float型、double型和longdouble

型三种实型数据的编码方式和存储形式,供C语言教学和程序设计时参考。1 实型数据的编码1.1 float型数据编码

float型数据码长四个字节32位,四个字节分别

记为B1,B2,B3和B4,32个位分别记为b1,b2,…,b32。其中,b1为符号位,0表示正数,1表示负数。b2

至b9为指数的编码,值为127。b10-b32为尾数编码,分别表示2

-1

,2

-2

,…,2

-23

各位上的数码。float型数

据的编码方式如下图所示

1-387-png_6_1_0_70_842_332_68_858_1165.5-1890-0-315-1890.jpg

公式(1)的几种例外情况:

(1)指数编码全部是1,而尾数编码全部为0时,表示±∞;

(2)指数编码全部是1,而尾数编码不全为0时,表示一个无效数字;

(3)指数编码全部是0,而尾数编码不全为0时,

p+1

f=±a 2;

(4)所有编码全部为0时,表示数0。1.1.1 由数值f确定其编码

先由p的值确定指数编码。当f≥2时,将f连续被2除,直到商a满足2>a≥1,p的值为除法运算的次数;当f<1时,将f连续被2乘,直到积a满足2>a≥1,p的值为负数,其绝对值为乘法运算的次数。将无符号数127+p转换为8位二进制码,即为指数的编码。

-1

再由a的值确定尾数编码。由于a=a12+…+a232

-23

,其中1>a≥0。采取乘2取整的方法,分别

float型数与编码的关系由如下公式

p

f=±(1+a) 2

[1-2]

表示

(1)

其中:f为一个单精度实型数,一般以十进制表示,符号由首位b1确定,p为指数,其值为8位无符号数与偏值127的差。a为尾数,a=a12

-1

求出a1,a2,…,a23的值。

例如f=100(>2)时,将100连续被2除6次,商为1.5625,指数p=6,将133(127+6)转换成8位无符号二进制数10000101,即得到了b2至b98个位的编码。对纯小数0.5625采取乘2取整,求得a1=a4=1,a2=a3=a5=…=a23=0,由此,得到b10至b3223

3收稿日期:2007-06-28

+a22

-2

+

-23

…+a232,其中,ai=0或1(i=1,2,…,23)。利用公式(1)可以实现数值与编码的转换。

作者简介:周恒忠(1956-),男,皖西学院计算机科学与技术系副教授,研究方向:程序设计及其语言、计算机图形学和图像处理。

19

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现用已知哈夫曼编码对文本文件编码,首先需要构建哈夫曼树,并生成对应的编码表。可以使用已有的哈夫曼编码表,也可以根据文本文件出现的字符及其出现频率来构建哈夫曼树和编码表。 具体的实现步骤如下: 1. 读取文本文件,统计每个字符出现的频率。 2. 根据字符频率构建哈夫曼树。 3. 生成哈夫曼编码表,将每个字符对应的编码存储起来。 4. 读取文本文件,将每个字符替换为其对应的哈夫曼编码。 5. 将编码后的文本写入新的文件。 下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_CHAR 256 // 哈夫曼树节点结构体 struct huffman_node { char c; // 字符 int freq; // 出现频率 struct huffman_node *left, *right; // 左右子树指针 }; // 哈夫曼编码结构体 struct huffman_code { char c; // 字符 char *code; // 编码 }; // 统计字符频率 int *count_freq(char *filename) { int *freq = (int *) calloc(sizeof(int), MAX_CHAR); FILE *fp = fopen(filename, "r"); char c; while ((c = fgetc(fp)) != EOF) { freq[c]++; } fclose(fp); return freq; } // 创建哈夫曼树 struct huffman_node *create_huffman_tree(int *freq) { struct huffman_node *nodes[MAX_CHAR]; int n = 0; for (int i = 0; i < MAX_CHAR; i++) { if (freq[i] > 0) { nodes[n] = (struct huffman_node *) malloc(sizeof(struct huffman_node)); nodes[n]->c = i; nodes[n]->freq = freq[i]; nodes[n]->left = NULL; nodes[n]->right = NULL; n++; } } while (n > 1) { // 找出频率最小的两个节点 int min1 = 0, min2 = 1; if (nodes[min1]->freq > nodes[min2]->freq) { int tmp = min1; min1 = min2; min2 = tmp; } for (int i = 2; i < n; i++) { if (nodes[i]->freq < nodes[min1]->freq) { min2 = min1; min1 = i; } else if (nodes[i]->freq < nodes[min2]->freq) { min2 = i; } } // 合并两个节点 struct huffman_node *parent = (struct huffman_node *) malloc(sizeof(struct huffman_node)); parent->c = '\0'; parent->freq = nodes[min1]->freq + nodes[min2]->freq; parent->left = nodes[min1]; parent->right = nodes[min2]; nodes[min1] = parent; nodes[min2] = nodes[n - 1]; n--; } return nodes[0]; } // 生成哈夫曼编码表 void generate_huffman_codes(struct huffman_node *node, char *code, int len, struct huffman_code *codes) { if (node->left == NULL && node->right == NULL) { // 叶子节点,保存编码 int idx = node->c; codes[idx].c = node->c; codes[idx].code = (char *) malloc(sizeof(char) * (len + 1)); strncpy(codes[idx].code, code, len); codes[idx].code[len] = '\0'; } else { // 非叶子节点,继续递归 code[len] = '0'; generate_huffman_codes(node->left, code, len + 1, codes); code[len] = '1'; generate_huffman_codes(node->right, code, len + 1, codes); } } // 哈夫曼编码 void huffman_encode(char *input_filename, char *output_filename, struct huffman_code *codes) { FILE *fin = fopen(input_filename, "r"); FILE *fout = fopen(output_filename, "w"); char c; while ((c = fgetc(fin)) != EOF) { fputs(codes[c].code, fout); } fclose(fin); fclose(fout); } int main() { char *input_filename = "input.txt"; char *output_filename = "output.txt"; int *freq = count_freq(input_filename); struct huffman_node *root = create_huffman_tree(freq); char code[MAX_CHAR]; struct huffman_code codes[MAX_CHAR]; generate_huffman_codes(root, code, 0, codes); huffman_encode(input_filename, output_filename, codes); return 0; } ``` 注意:以上代码仅供参考,实际应用还需要进行错误处理、内存释放等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值