欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析C语言中的数据类型

时间:11-08 神话故事 提交错误

本篇文章给大家谈谈深入解析C语言中的数据类型,以及对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

数据类型

2.1.3 常量

常量:程序运行过程中,其值不能改变的常量一般出现在表达式或赋值语句中。常量类型具体示例。整型常量100, 200, -100, 0 实型常量3.14 , 0.125, -3.123 字符常量"a", "b", "1", "n" 字符串常量"a", "ab", "12356"

2.1.4 变量

1.变量变量:程序运行过程中,其值可以改变。变量在使用前必须先定义,定义变量前必须有相应的数据类型标识符命名规则:标识符不能是关键字。标识符只能由字母、数字和下划线组成。第一个字符必须是字母或下划线。标识符中的字母区分大小写:变量特点:。相应的内存空间是在编译时分配给变量的,并且可以通过它进行传递。名字地址访问对应的内存

这里插入图片描述2.声明和定义区别声明变量不需要创建存储空间,如:extern int a;定义变量需要创建存储空间,如:int b; #includeint main()

{

//extern关键字只是一个语句,不能定义。我们稍后会详细了解它。我们先来了解一下。

//声明一个变量a,这里不创建存储空间

外部整数a;

a=10; //err,如果没有空间,则无法赋值

整数b=10; //定义一个变量b,b的类型为int,b的值为10

返回0;

}从广义上讲,声明包含定义,即定义是声明的一个特例,所以并非所有声明都是定义:

int b 既是声明又是定义。对于extern b 来说,它只是一个声明,而不是一个定义。一般来说,创建存储空间的语句称为“定义”,不需要创建存储空间的语句称为“定义”。 “陈述”。

2.1.5 使用示例

#include#define MAX 10 //声明一个常量,名为MAX,值为10。该常量一旦初始化,其值就不能更改。

int main()

{

整数a; //定义了一个变量,类型为int,名称为a

常量int b=10; //定义一个名为b的const常量,值为10

//b=11; //err,常量的值不能改变

//最大=100; //err,常量的值不能改变

a=MAX;//设置abc的值为MAX的值

a=123;

printf("%dn", a); //打印变量a的值

返回0;

}

2.2 进制

十六进制也是进位制,是人们规定的进位方式。对于任何基数制——X基数制来说,是指每次计算时将某个位置上的数字进行一位数的计算。十进制系统每十分之一进位一次,十六进制系统每十六进位一次,二进制系统每两位进位一次,以此类推,基于x 的系统每x 进位一次。十进制二进制八进制十六进制0000111121022311334100445101556110667111778100010891001 11910101012A11101113B12110014C13110115D14111016E15111117F16100002010

2.2.1 二进制

二进制是计算技术中广泛使用的数字系统。二进制数据是由0和1两位数字表示的数字,其基数为2,进位规则为“入二则加一”,借位规则为“借一等于二”。

现在的计算机系统基本上都采用二进制,数据在计算机中主要是以补码的形式存储的

术语含义位(bit)代表一个二进制位,一个位只能代表两种状态:0或1。数据传输通常以“位”为单位。字节(byte) 一个字节是8个二进制数,称为8位。计算机中存储的最小单位是字节。数据存储习惯上以“字节”(Byte)来衡量。 WORD(双字节)2字节、16位DWORD 2个WORD、4字节、32位1b1bit、1位1B1Byte、1字节、8位1k、1K10241M(1兆字节)1024k、1024*10241G1024M1T1024G1Kb(千字节)1024bit、 1024 位1KB(千字节) 1024Byte、1024 字节1Mb(兆位) 1024Kb=1024 * 1024bit 1MB(兆字节) 1024KB=1024 * 1024Byte十进制转化二进制的方法:将十进制数除以2,分别得到余数和商。当商为0时,倒数余数即可得到转换后的结果。

在此插入图片描述

十进制的小数转换成二进制:将小数部分乘以2 并四舍五入为整数。如果小于1,则取0.每次相乘都是小数部分。按顺序四舍五入后的数字就是转换后的结果。

这里插入图片描述

2.2.2 八进制

八进制,缩写OCT或O,一种以8为基数的计数方法,使用八个数字0、1、2、3、4、5、6、7,每个八进制1。 一些编程语言往往以数字0开头,表示该数字是八进制。

八进制数和二进制数可以逐位对应(八进制一位对应二进制三位),因此在计算机语言中经常使用它们。

在此插入图片描述

十进制转化八进制的方法:将十进制数除以8,分别得到余数和商。当商为0时,倒数余数即可得到转换后的结果。

这里插入图片描述

2.2.3 十六进制

十六进制(英文名:Hexadecimal)与我们日常生活中的表示不同。它由0-9、A-F、字母不区分大小写组成。与十进制的对应关系为:0-9对应0-9,A-F对应10-15。

十六进制数和二进制数可以逐位对应(十六进制一位对应二进制四位),因此在计算机语言中经常使用。

在此插入图片描述

十进制转化十六进制的方法:将十进制数除以16,分别得到余数和商。当商为0时,倒数余数即可得到转换后的结果。

此处插入图片描述

2.2.4 C语言如何表示相应进制数

十六进制的具体示例。十进制以普通数字1-9开头,如123。八进制以数字0开头,如0123。十六进制以0x开头,如0x123。二进制C语言不能直接写二进制数#includeint main()

{

整数a=123; //十进制模式赋值

整数b=0123; //以八进制格式赋值,从数字0开始

int c=0xABC; //以十六进制格式赋值

//如果在printf中输出十进制数使用%d,八进制使用%o,十六进制使用%x

printf("十进制: %dn",a);

printf("总计: %on", b); //%o是字母o,不是数字

printf("十六进制: %xn", c);

返回0;

}

2.3 计算机内存数值存储方式

2.3.1 原码

一个数的原码(原始的二进制码)有如下特点:最高位作为符号位,0 表示正,1 表示负。其他数字部分是值本身的绝对值的二进制数。负数的原码是根据其绝对值,最高位变为1下面数值以1字节的大小描述:,原十进制码+150000 1111-151000 1111+00000 0000-01000 0000原码表示简单,易于理解明白了,和有符号数本身进行转换很容易,只要恢复符号即可,但是当两个正数相减或不同符号的数相加,必须进行比较,以两个数的绝对值较大者来决定谁相减,以及结果是正数还是负数。因此,原代码不方便进行加减运算。

2.3.2 反码

对于正数,补码与原码相同。对于负数,符号位保持不变,其他部分反转(1变为0,0变为1)。十进制数的补码+150000 1111-151111 0000+00000 0000-01111 1111 补码操作也不方便,通常用作求补码的中间过渡。

2.3.3 补码

在计算机系统中,数值一律用补码来存储。补码特点:对于正数,原码、反码、补码相同。对于负数,补码是其反码加上1 的补码。符号位不变,其他位取反,最后整个数加1,得到原十进制数的补码+150000 1111-151111 0001+00000 0000-00000 0000#includeint main()

{

整数a=-15;

printf("%xn", a);

//结果为ffffffff1

//fffffff1对应的二进制:1111 1111 1111 1111 1111 1111 1111 0001

//符号位不变,其他取反:1000 0000 0000 0000 0000 0000 0000 1110

//上面加1:1000 0000 0000 0000 0000 0000 0000 1111。最高位1代表负数,即-15

返回0;

}

2.3.4 补码的意义

示例一:用8位二进制数分别表示+0和-0。

十进制数的原码+00000 0000-01000 0000 十进制数的补码+00000 0000-01111 1111 无论是用原码存储还是用补码存储,0 也有两种表示形式。为什么同一个0有两种不同的表示方法?

但如果以二进制补码格式存储,则二进制补码统一了零的编码:

十进制数+00000 0000-010000 0000 的补码仅用8 位描述,最高位1 被丢弃,变为0000 0000 示例2:计算9-6 的结果

以原码方式相加:原始十进制代码90000 1001-61000 0110在此插入图片说明

结果是-15,这是不正确的。

以补码方式相加:十进制补码90000 1001-61111 1010在此插入图片说明

1的最高位溢出,剩下的8个二进制位代表3,这是正确的。

在计算机系统中,数值一律用补码来存储,主要原因有:

对零进行统一编码,对符号位和其他位进行统一处理,将减法运算转换为加法运算。两个补码表示的数字相加时,如果最高位(符号位)有进位,则丢弃该进位

2.4 sizeof关键字

sizeof 不是函数,因此不需要包含任何头文件。它的功能是计算数据类型的大小。单位是字节。 sizeof的返回值为size_tsize_t。该类型在32 位操作系统下是无符号的。 int,是一个无符号整数#includeint main()

{

整数a;

int b=sizeof(a);//sizeof获取指定值占用的内存大小,单位:字节

printf("b=%dn", b);

size_t c=sizeof(a);

printf("c=%un", c);//将c的值作为无符号数输出

返回0;

}

2.5整型:int

2.5.1 整型变量的定义和输出

打印格式含义%d 输出有符号十进制int 类型%o(字母o)输出八进制int 类型%x 输出十六进制int 类型,字母小写输出% X 输出十六进制int 类型,字母以大写字母输出%u 输出十进制无符号数#includeint main()

{

整数a=123; //定义变量a,并赋值为十进制形式的123

整数b=0567; //定义变量b,并以八进制方式赋值给0567

int c=0xabc; //定义变量c并以十六进制方式赋值给0xabc

printf("a=%dn", a);

printf("八进制: b=%on", b);

printf("十进制:b=%dn", b);

printf("十六进制: c=%xn", c);

printf("十六进制: c=%Xn", c);

printf("十进制:c=%dn", c);

无符号整型d=0xffffffff; //定义unsigned int变量d并以十六进制格式赋值

printf("签名打印:d=%dn", d); //d=-1

printf("无符号打印: d=%un", d); //d=4294967295

返回0;

}

2.5.2 整型变量的输入

#includeint main()

{

整数a;

printf("请输入a的值:");

//不加“n”

scanf("%d", a);

printf("a=%dn", a); //打印a的值

返回0;

}

2.5.3 short、int、long、long long

数据类型占用空间short(短整型)2字节int(整型)4字节long(长整型)Windows为4字节,Linux为4字节(32位),8字节(64位)long long (长整数)8 字节注意:。需要注意的是,整数数据在内存中占用的字节数与所选择的操作系统有关。虽然C语言标准中没有明确规定整型数据的长度,但long型整型的长度不能小于int型,short型整型的长度不能小于int型。当将小数据类型分配给大数据类型时,不会发生错误,因为编译器会自动进行转换。但是,当将大类型分配给小数据类型时,高位可能会丢失。整型常量所需类型10 代表int 类型10l,10L 代表long 类型10ll,10LL 代表long long 类型10u,10U 代表unsigned int 类型10ul,10UL 代表unsigned long 类型10ull,10ULL 代表unsigned long long 类型打印格式含义%hd输出short类型%d 输出int类型%l 输出long类型%ll 输出long long类型%hu输出unsigned Short 类型%u 输出unsigned int 类型%lu 输出unsigned long 类型%llu 输出unsigned long long 类型#includeint main()

{

短a=10;

整数b=10;

长c=10l; //或10L

长长d=10ll; //或10LL

printf("sizeof(a)=%un", sizeof(a));

printf("sizeof(b)=%un", sizeof(b));

printf("sizeof(c)=%un", sizeof(c));

printf("sizeof(c)=%un", sizeof(d));

printf("短a=%hdn", a);

printf("int b=%dn", b);

printf("long c=%ldn", c);

printf("long long d=%lldn", d);

无符号短a2=20u;

无符号整型b2=20u;

无符号长c2=20ul;

无符号长长d2=20ull;

printf("无符号短a=%hun", a2);

printf("无符号整数b=%un", b2);

printf("无符号长c=%lun", c2);

printf("unsigned long long d=%llun", d2);

返回0;

}

2.5.4 有符号数和无符号数区别

1.有符号数对于有符号数,最高位为符号位,0代表正数,1代表负数。

在此插入图像描述#includeint main()

{

有符号整数a=-1089474374; //定义有符号整型变量a

printf("%Xn", a); //结果为BF0FF0BA

//B F 0 F F 0 B A

//1011 1111 0000 1111 1111 0000 1011 1010

返回0;

}2.无符号数无符号数的最高位不是符号位,而是数的一部分。无符号数不能是负数。

在此插入图像描述#includeint main()

{

无符号整数a=3236958022; //定义无符号整型变量a

printf("%Xn", a); //结果为C0F00F46

返回0;

}当我们编写程序来处理不可能出现的负值时,我们一般使用无符号数,这样可以增加数字的最大值。

3.有符号和无符号整型取值范围数据类型占用空间取值范围Short2 字节-32768 32767 (-215 215-1)int4 字节-2147483648 2147483647 (-231 231-1)long4 字节-2147483648 2147483647 (-231 231-1) unsigned Short2 byte 0 to 65535 (0 ~ 216-1) unsigned int4 byte 0 to 4294967295 (0 ~ 232-1) unsigned long4 byte 0 to 4294967295 (0 ~ 232-1) 在此插入图片描述

2.6字符型:char

2.6.1 字符变量的定义和输出

字符变量用于存储单个字符,在C语言中用char表示。每个字符变量占用1个字节。给字符变量赋值时,需要用英文半角格式的一对单引号(" ")将字符括起来。

字符变量实际上并不是将字符本身放入变量的存储单元中,而是将字符对应的ASCII码放入变量的存储单元中。char的本质就是一个1字节大小的整型

#includeint main()

{

char ch="a";

printf("sizeof(ch)=%un", sizeof(ch));

printf("ch[%%c]=%cn", ch); //打印字符

printf("ch[%%d]=%dn", ch); //打印"a"的ASCII值

字符A="A";

字符a="a";

printf("a=%dn", a); //97

printf("A=%dn", A); //65

printf("A=%cn", "a" - 32); //将小写a转换为大写A

printf("a=%cn", "A" + 32); //将大写A转换为小写a

ch=" ";

printf("空字符: %dn", ch); //空字符的ASCII值为32

printf("A=%cn", "a" - " "); //将小写a转换为大写A

printf("a=%cn", "A" + " "); //将大写A转换为小写a

返回0;

}

2.6.2 字符变量的输入

#includeint main()

{

字符ch;

printf("请输入ch的值:");

//不加“n”

scanf("%c", ch);

printf("ch=%cn", ch); //打印ch的字符

返回0;

}

2.6.2 ASCII对照表

ASCII 值控制字符ASCII 值字符ASCII 值字符ASCII 值字符0NUT32(空格)6496, 1SOH33!65A97a2STX34"66B98b3ETX3567C99c4EOT36$68D100d5ENQ37%69E101e6ACK 3870F102f7B EL39,71G103g8BS40(72H104h9HT41)73I105i10LF4274J106j11VT43+75K107k12FF44,76L108l13CR4577M109m14SO46.78N110n15SI4 7/79O111o16DLE48080P11 2p17DCI49181Q113q18DC250282R114r19DC351383S115s20DC452484T116t21NAK53585U117u22SYN54686V118v23TB5578 7W119w24CAN56888X120x25EM57989Y121 y26SUB58:90Z122z27ESC59; 91[123{28FS6092/124I29GS6193]125}30RS6294^126`31US63?95127DELASCII 码大致由以下两部分组成:ASCII 非打印控制字符:ASCII 表中的数字0-31 分配给控制字符,用于控制一些外围设备,如打印机。 ASCII 打印字符:数字32-126 分配给可以在键盘上找到并在查看或打印文档时出现的字符。数字127代表Del命令。

2.6.3 转义字符

转义字符含义ASCII 码值(十进制)a报警007b退格键(BS),将当前位置移动到上一列008f换页(FF),将当前位置移动到下一页的开头012 n换行(LF),将当前位置移动到下一行的开头010r回车(CR),将当前位置移动到本行的开头013t水平制表符(HT)(跳转到下一个制表符位置)009 vVertical Tab (VT)011 表示反斜杠字符"092" 表示单引号(撇号)字符039" 表示双引号字符03 4?代表问号063数字0000ddd八进制转义字符,d范围0~73八进制xhh16转义字符,h范围09、af、A~F 3个十六进制字符注意:红色字体标注的为不可打印字符

#includeint main()

{

printf("abc");

printf("refgn"); //r切换到句首,n是换行键

printf("abc");

printf("befgn");//b为退格键,n为换行键

printf("%dn", "123");//"123"

"为8进制转义字符,0123对应10进制数为83 printf("%dn", "x23");// "x23"为16进制转义字符,0x23对应10进制数为35 return 0; }

2.6.4 数值溢出

当超过一个数据类型能够存放最大的范围时,数值会溢出。有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失。 数据类型占用空间取值范围char1字节-128到 127(-27 ~ 27-1)unsigned char1字节0 到 255(0 ~ 28-1)在这里插入图片描述#includeint main() { char ch; //符号位溢出会导致数的正负发生改变 ch = 0x7f + 2; //127+2 printf("%dn", ch); // 0111 1111 //+2后 1000 0001,这是负数补码,其原码为 1111 1111,结果为-127 //最高位的溢出会导致最高位丢失 unsigned char ch2; ch2 = 0xff+1; //255+1 printf("%un", ch2); // 1111 1111 //+1后 10000 0000, char只有8位最高位的溢出,结果为0000 0000,十进制为0 ch2 = 0xff + 2; //255+1 printf("%un", ch2); // 1111 1111 //+1后 10000 0001, char只有8位最高位的溢出,结果为0000 0001,十进制为1 return 0; }

2.7实型(浮点型):float、double

实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种: 单精度浮点数(float)、 双精度浮点数(double), 但是double型变量所表示的浮点数比float型变量更精确。 数据类型占用空间有效数字范围float4字节7位有效数字double8字节15~16位有效数字由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。#includeint main() { //传统方式赋值 float a = 3.14f; //或3.14F double b = 3.14; printf("a = %fn", a); printf("b = %lfn", b); //科学法赋值 a = 3.2e3f; //3.2*1000 = 32000,e可以写E printf("a1 = %fn", a); a = 100e-3f; //100*0.001 = 0.1 printf("a2 = %fn", a); a = 3.1415926f; printf("a3 = %fn", a); //结果为3.141593 return 0; }

2.8类型限定符

限定符含义extern声明一个变量,extern声明的变量没有建立存储空间。`extern int a;const定义一个常量,常量的值不能修改。const int a = 10;volatile防止编译器优化代码register定义寄存器变量,提高效率。register是建议型的指令,而不是命令型的指令,如果CPU有空闲寄存器,那么register就生效,如果没有空闲寄存器,那么register无效。

2.9字符串格式化输出和输入

2.9.1 字符串常量

字符串是内存中一段连续的char空间,以""(数字0)结尾。字符串常量是由双引号括起来的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。字符串常量与字符常量的不同:在这里插入图片描述 每个字符串的结尾,编译器会自动的添加一个结束标志位"",即 "a" 包含两个字符"a"和’’。

2.9.2 printf函数和putchar函数

printf是输出一个字符串,putchar输出一个char。printf格式字符:打印格式对应数据类型含义%dint接受整数值并将它表示为有符号的十进制整数%hdshort int短整数%huunsigned short无符号短整数%ounsigned int无符号8进制整数%uunsigned int无符号10进制整数%x,%Xunsigned int无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF%ffloat单精度浮点数%lfdouble双精度浮点数%e,%Edouble科学计数法表示的数,此处"e"的大小写代表在输出时用的"e"的大小写%cchar字符型。可以把输入的数字按照ASCII码相应转换为对应的字符%schar *字符串。输出字符串中的字符直至字符串中的空字符(字符串以"‘结尾,这个""即空字符)%pvoid *以16进制形式输出指针%%%输出一个百分号printf附加格式:字符含义l(字母l)附加在d,u,x,o前面,表示长整数左对齐m(代表一个整数)数据最小宽度0(数字0)将输出的前面补上0直到占满指定列宽为止不可以搭配使用-m.n(代表一个整数)m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度,用于说明输出的实型数的小数位数。对数值型的来说,未指定n时,隐含的精度为n=6位。#includeint main() { int a = 100; printf("a = %dn", a);//格式化输出一个字符串 printf("%pn", &a);//输出变量a在内存中的地址编号 printf("%%dn"); char c = "a"; putchar(c);//putchar只有一个参数,就是要输出的char long a2 = 100; printf("%ld, %lx, %lon", a2, a2, a2); long long a3 = 1000; printf("%lld, %llx, %llon", a3, a3, a3); int abc = 10; printf("abc = "%6d"n", abc); printf("abc = "%-6d"n", abc); printf("abc = "%06d"n", abc); printf("abc = "%-06d"n", abc); double d = 12.3; printf("d = " %-10.3lf "n", d); return 0; }

2.9.3 scanf函数与getchar函数

getchar是从标准输入设备读取一个char。scanf通过%转义的方式可以得到用户通过标准输入设备输入的数据。#includeint main() { char ch1; char ch2; char ch3; int a; int b; printf("请输入ch1的字符:"); ch1 = getchar(); printf("ch1 = %cn", ch1); getchar(); //测试此处getchar()的作用 printf("请输入ch2的字符:"); ch2 = getchar(); printf(""ch2 = %ctest"n", ch2); getchar(); //测试此处getchar()的作用 printf("请输入ch3的字符:"); scanf("%c", &ch3);//这里第二个参数一定是变量的地址,而不是变量名 printf("ch3 = %cn", ch3); printf("请输入a的值:"); scanf("%d", &a); printf("a = %dn", a); printf("请输入b的值:"); scanf("%d", &b); printf("b = %dn", b); return 0;

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

用户评论

一别经年

C语言的数据类型很重要啊,它决定了变量能存的内容。

    有13位网友表示赞同!

呆萌

我记得初学C语言的时候就对各种数据类型感到好奇。

    有9位网友表示赞同!

无望的后半生

不同的数据类型对应着不同的存储空间占用啊。

    有6位网友表示赞同!

此刻不是了i

比如整数和小数它们的表示方式就不同吧。

    有6位网友表示赞同!

軨倾词

在练习代码的时候,确定好数据的类型真的非常关键。

    有13位网友表示赞同!

熏染

学习的数据结构和算法也离不开C语言中的数据类型。

    有9位网友表示赞同!

雁過藍天

有时候操作数据类型需要用到一些专门的函数操作吧?

    有9位网友表示赞同!

十言i

各种数据类型的转换应该也是一个需要注意的地方?

    有6位网友表示赞同!

惯例

想了解一下布尔型变量具体是怎么个表示法呢?

    有11位网友表示赞同!

执念,爱

指针变量的数据类型也挺复杂的啊,还需要好好研究一下。

    有18位网友表示赞同!

一生荒唐

我觉得C语言的数据类型还是蛮清晰易懂的,不用太纠结。

    有11位网友表示赞同!

夏以乔木

学习了C语言的数据类型可以更好地理解代码实现机制吧?

    有5位网友表示赞同!

旧爱剩女

想问问有没有哪些数据类型的运用比较广泛呢?

    有18位网友表示赞同!

良人凉人

学习C语言中各种数据类型的转换技巧是不是很有用?

    有14位网友表示赞同!

漫长の人生

应该会有很多实际应用项目用到这些数据类型吧?

    有15位网友表示赞同!

回忆未来

了解C语言的数据类型会让我在编程领域更上一层楼吗?

    有20位网友表示赞同!

焚心劫

感觉学一门新技术首先得了解清楚基本概念啊,比如数据类型。

    有18位网友表示赞同!

蝶恋花╮

学习数据类型也是培养逻辑思维的一种方式呢。

    有16位网友表示赞同!

苏莫晨

我想看看C语言的数据类型有哪些常见的应用场景吧?

    有15位网友表示赞同!

龙吟凤

在编程过程中数据类型真的非常重要的一环啊!

    有13位网友表示赞同!

【深入解析C语言中的数据类型】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活