经过两三天的学习,我发现Delphi中的数据类型比较多,而且比较灵活。尤其是字符串、字符这几个
类型。同时发现Delphi中还存在一些比较特殊的数据类型,比方说集合, 这个比较有意思,可以进行输入组合
的判断。
program DataStruct; {$APPTYPE CONSOLE} { 本项目/工程用来测试D7中的各种数据类型 } uses SysUtils; type //整型数记录 iStruct=record ishortint:shortint; //8位有符号整数 iByte:byte; // 8位无符号整数 ismallint:smallint; //16位有符号整数 iword:word; //16位无符号整数 iInteger:integer; //32位有符号整数 iLongint:longint; //32位有符号整数 iCardinal:cardinal; //32位无符号整数 iLongword:longword; //32位无符号整数 iInt64:int64; //64位有符号整数 end; //浮点数记录 fReal=record fsingle:single; //4字节浮点数 freal48:real48; //6字节浮点数 fdouble:double; //8字节浮点数 fextended:extended; //10字节浮点数 fcurrency:currency; //64位货币值 end; //字符串记录 strStruct=record strshortstring:shortstring; //固定长度字节的字符串 stransistring:ansistring; //动态字符串 strpchar:pchar; //以NULL结束的字符串 strwpchar:pwidechar; //以NULL结束的宽字符串 strwide:widestring; //动态宽字符串 end; //字符型记录 charStruct=record ByteChar:char; WodeChar:widechar; end; var myvar1:istruct; myvar2:freal; myvar3:strstruct; myvar4:charstruct; str:string[100]; begin { TODO -oUser -cConsole Main : Insert code here } {8位有符号整数 如果用小于-128的值赋值给myvar1.ishortint,则编译报错 如果用大于127的值赋值给myvar1.ishortint,则编译报错 } myvar1.ishortint:=127; { 8位无符号整数 如果用大于255的值赋值给myvar1.ibyte 则编译报错 如果用小于0的值赋值给myvar1.ibyte则编译报错 } myvar1.iByte:=255; writeln(myvar1.ibyte); { 16位有符号整数 如果用小于-32768的值,或者大于32767的值赋值给myvar1.ismallint 则编译报错 } myvar1.ismallint:= 32767; {16位无符号整数 如果用小于0的数赋值给mayvar1.iword,则编译报错 如果用大于65535的数赋值给myvar1.iword,则编译报错 } myvar1.iword:=65535; {32位有符号整数 这个值比较大,通常32位的有符号整数可以满足一般的应用, } myvar1.iInteger:=39939339; myvar1.iInteger:=myvar1.iInteger*(-1); myvar1.iLongint:=myvar1.iinteger; {32 无符号整数 这个值也较大,通常可以满足一般的应用 } myvar1.iCardinal:=890879789; myvar1.ilongword:=myvar1.iInteger; {64位有符号整数 在Object Pascal中没有提供64位的无符号整数类型 这个类型的数数据范围更大,一般的应用如果数值不是太大 建议不要使用这个类型的数据 } myvar1.iInt64:=893802830283209; {4字节浮点数 在数据变量被定义后,其所占的内存空间为4字节 这就是sigle类型的数据,即单精度数据类型, 通过实例可以知道单精度的精度是小数点后 6位 } myvar2.fsingle:=3.93998777888; writeln(myvar2.fsingle); {6字节浮点数 real48 这个类型的数据是为了和低版本的Delphi兼容才保留的,因此不作介绍 } {8字节浮点数 即双精度浮点数,在存在占用8字节 通过实例可以知道,双精度浮点数的精度是小数点后13位 } myvar2.fdouble:=3.141592678934545876; writeln(myvar2.fdouble); {10字节浮点数 即extended类型的浮点数, 在内存中占用10个字节 通过实例可以知道extended型浮点数的精度是小数点后14位 } myvar2.fextended:=3.12345678910111213; writeln(myvar2.fextended); {8字节货币类型浮点数 即currency类型的浮点数,在内存中占用8字节 可以知道currency类型的浮点数的精度是小数点后4位数 } myvar2.fcurrency:=3.123456789101112; writeln(myvar2.fcurrency); {固定长度是字符串 在Object Pascal中定义的固定长度的字符串类型是shortstring 这种数据类型可以容纳的字符长度最长是255个字节。 并且字符串类型可以和数组类型一样引用 } myvar3.strshortstring:='abcd'; //这里有一点需要说明,在为shotstring分配的字节里面, //字符串的首字节存储的是字符串的长度。 if myvar3.strshortstring[0]=#4 then writeln('the length of myvar3.strshortstring "',myvar3.strshortstring,'" is:',length(myvar3.strshortstring)); { 动态字符串 相对来说动态字符串比较灵活。 可以利用关键字:string来定义字符串变量(准确的说应该是对象) 但是这里存在一个问题,有那么多的字符串类型,那么string默认的定义类型是什么呢? 在D2环境以后,string定义的对象,默认的定义为ansistring。 可以通过编译开关/选项来修正这个默认选项 } //开启编译选项 {$H-} //string定义的字符串为shortsting类型 {$H+} //string定义的字符串为ansistring { 开启 H+选项后,存在一个例外,那就是指定字符串长度的时候,为shortstring类型 如下: str为100字节长度的shortstring字符串对象 str:string[100] 前面定义了一个这样的变量,我们来测试一下它的长度 } //下面语句输出的结果是101,说明系统默认会给字符串加上一个表示它长度的字节 //同样可以验证,H+选项的例外情况 writeln('the length of str is:',sizeof(str)); { 以NULL结束的字符串 由这个标题可以知道, shortstring、 ansistring字符串类型默认的字符串结束符 不是NULL, 而可以是别的字符, 这就是与C语言中的“abcd”这样的字符长之间的 区别,为了兼容win32 API函数,D中内置了以NULL结束的字符串类型 pchar。 } //Exp: 从下面的实例来看 sizeof在对pchar类型的字符串求长度时没有计算#0占用的空间 //同时可以知道pchar在处理字符串时自动会在最后增加NULL字符 //同样也可以知道 'abcd' 占用4字节空间。 myvar3.strpchar:='abcd'; if (myvar3.strpchar[4]= #0) and (myvar3.strpchar[0]='a') then writeln('the length of myvar3.strpchar is:',sizeof(myvar3.strpchar)); {单字节字符 这个就和C语言中的字符一样, 可以用两种方法, 'a' 这种常量表示法 或者用 #13这样的表示法 我们可以知道: a = #61 不知道单个字符在Delphi中怎么表示, 希望那位大侠解释下? } myvar4.ByteChar:=#61; if myvar4.ByteChar='a' then writeln('the myvar4.byte is:',#61); readln(myvar3.stransistring); end.
还有几个小问题没有解决:
1、 Delphi中字符怎么表示, 我用'a'这样的格式进行测试发现没法和#61 兼容, 61是a的ASCII码值。
2、 #这样是表示单个字符吗? 经过我前两天的学习和这几天的测试,发现这样就和C中的\061一样的
效果。