频道栏目
读书频道 > web开发 > .NET > Visual C++ .NET程序设计教程(第2版)
2.2.2 基本值类型
2012-11-26 10:56:34     我来说两句
收藏   我要投稿
本书以Visual C++ .NET为平台介绍程序设计方法。第一部分为教程,首先介绍Visual C++ .NET开发环境,然后介绍C++/CLI语言基础和C++/CLI面向对象编程基础,在这个基础上系统介绍Visual C++ .NET应用程序设计...  立即去当当网订购

在C++/CLI中,基本值类型包括整型、浮点型、实数型、布尔型和字符型。当然,为了向下兼容ISO C++程序,在程序中仍然可以使用原有的基本数据类型,但数组、结构、枚举等构造类型除外。下面来分别说明各个值类型。

1. 整型

在C++/CLI程序中,可以使用的整数总共有8种,如表2-4所示。


 

需要说明的是:

(1)标准C++基本类型的名称是C++/CLI程序中值类型的别名,因此原则上既可以使用.NET类库中的值类型,也可直接使用C++/CLI的别名。例如:
int  count = 10;
double value = 2.5;

等价于:
Int32 count = 10;
System::Double value = 2.5;

(2)值类型Byte和SByte是最小的整型,它们仅占1个字节,分别对应于C++/CLI的别名unsigned char和char。其中,值类型Byte是0~255。特别地,在ISO C++中,char称为字符型,用来表示ASCII单个字符。

(3)要注意char与.NET类型System::Char(后面还会讨论)的区别:System::Char表示16位的Unicode字符,而char表示的是8位的ACSII字符。

下面来看一个控制台应用程序Ex_Int。

【例Ex_Int】整型数据
#include "stdafx.h"
using namespace System;
int main(array<System::String ^> ^args)
{
 char  v = 'F';   // 用字符常量进行初始化
 short  w(123);    // 用括号方式初始化
 int  x = 456789;   // 用十进制整数赋值
 long  y = 123456789L;  // 用长整型数赋值,注意后缀L
 Int64  z = 0xFEDCBA123456789;  // 用十六进制赋值

 Console::WriteLine( v );
 Console::WriteLine( w );
 Console::WriteLine( x );
 Console::WriteLine( y );
 Console::WriteLine( y.ToString() );
 Console::WriteLine( z );
 Console::WriteLine( z.ToString() );
 return 0;
}

编译运行,结果如下(以后仅将结果列出,也不再显示“请按任意键继续...”,同时代码中产生的注释内容“// Ex_Int.cpp: 主项目文件。”也不再列出,本书约定):
70
123
456789
123456789
123456789
1147797372991268745
1147797372991268745

需要说明的是,由于x、y等在C++/CLI中都是数值型(值类型)对象,因而可以调用其成员函数ToString,用来获取类型对象相匹配的字符串内容。同样,字面常量也是值类型对象,也可以使用这些成员,例如:

Console::WriteLine( (123).ToString() );

2. 浮点型

在C++/CLI程序中,浮点类型只有两种,如表2-5所示。


 

需要说明的是:

(1)虽然C++/CLI也支持long double类型,但在Microsoft平台里,long double和double是一样的。

(2)System::Single是单精度值类型,32位,有效位数为7;而System::Double是双精度值类型,64位,有效位数为15。

(3)在函数和成员中,默认处理的浮点数都是double型的。

下面来看一个控制台应用程序Ex_Float。

【例Ex_Float】浮点数据
#include "stdafx.h"
using namespace System;
int main(array<System::String ^> ^args)
{
 float   w = 123.456f;   // 浮点数的小数标准形式
 System::Single x = 7890e4f;    // 浮点数的指数形式
 double   y = 123456789.123456789; // 有效位太长
  Double   z = 123456789012345e-300; // 指数形式将被重置

 Console::WriteLine( w );
  Console::WriteLine( x );
 Console::WriteLine( y );
  Console::WriteLine( z ); 
 return 0;
}

编译运行,结果如下:
123.456
7.89E+07
123456789.123457
1.23456789012345E-286

代码中,指定的数据类型名既可以是C++/CLI的ISO C++类型,也可以是.NET的值类型,同时由于在程序前面指定了值类型所在的命名空间System,故Single类型也可像Double使用一样,不指定“System::”。这样一来,在C++/CLI程序中就可使用不同风格的类型名,似乎有点混乱,因此对于由C++转用C++/CLI程序员来说,保留已有的习惯应是最好的方式之一。

3. Decimal型

C++/CLI的十进制实数类型只有一个System::Decimal,用来要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。一个Decimal值的范围为±7.9×10-28~±7.9×1028,虽远小于浮点类型,但它有28个有效位。

需要说明的是,System::Decimal仅仅是一个.NET值类型,而不是像float、int等的本地C++/CLI类型。因此在C++/CLI程序中使用System::Decimal值存取或进行初始化时,可有下列几种方法:

(1)使用System::Convert::ToDecimal将一个包含Decimal值的字符串转换成Decimal值:

Decimal w = System::Convert::ToDecimal("123456789012345678901.2345678");

(2)使用System::Decimal结构构造函数,可以将任意整数、实数转换成Decimal类型。当然,也可按Decimal 结构进行构造,其值的二进制表示形式由 1位符号、96位整数以及比例因子组成,比例因子用作 96 位整数的除数并指定整数的哪一部分为小数。比例因子是10为底的幂指数,范围从0到28。具体的结构如下:
public: Decimal( 
 int lo,     // 96位整数的低32位
 int mid,     // 96位整数的中32位
 int hi,     // 96位整数的高32位
 bool isNegative,    // 是否为负,false表示正
 unsigned char scale    // 比例因子,0~28
);

下面来看一个程序。
【例Ex_Decimal】Decimal数据
#include "stdafx.h"
using namespace System;
int main(array<System::String ^> ^args)
{
 Decimal w = System::Convert::ToDecimal("123456789012345678901.2345678");
 Console::WriteLine( w );

 Decimal x = (Decimal)0.1234567890123456789012345678; // A
 Decimal y = (Decimal)0.0000000000000000789012345678; // B

 Console::WriteLine( x );
 Console::WriteLine( y );
 // 使用Decimal构造函数
 Decimal z(0xeb1f0ad2, 0xab54a98c, 0, false, 0); // = 12345678901234567890
 Console::WriteLine( z );
 return 0;
}

编译运行,结果如下:
123456789012345678901.2345678
0.123456789012346
0.0000000000000000789012345678
12345678901234567890

4. 布尔型

C++/CLI提供的布尔(bool)类型只有一种,如表2-6所示。

5.字符型

C++/CLI提供的字符型只有一种,如表2-7所示,用来表征单个16位Unicode字符。


 

所谓Unicode字符,是基于这样的一个事实:多年来,计算机普遍采用美国信息交换标准代码(American Standard Code for Information Interchange,简称ASCII码)来表示字符。这些字符可以是字母、数字、标点符号和控制符。用这种编码来表示英文在内的字符是不成问题的,但要表示其他语言文字如阿拉伯文、中文、日文、维文、哈文等,则必须进行扩充。为解决这个问题,国际标准组织于1984年4月成立ISO/IEC JTC1/SC2/WG2工作组,制订了Unicode协议,即使用2个字节的编码方式。

在程序中,用字符常量初始化System::Char变量时,字符常量需用一对单引号括起来,当字符常量前面有前缀“L”时表示Unicode字符,否则为一般字符,如下面的程序。

【例Ex_Char】字符数据
#include "stdafx.h"
using namespace System;
int main(array<System::String ^> ^args)
{
 Char  a = L'A';  // 字符常量'A'
 Char  b = L'\x0041';  // 通过转义符用16进制的Unicode编码值指定字符'A'
 Console::WriteLine ( a );
 Console::WriteLine ( b );
 return 0;
}

编译运行,结果如下:
A
A

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:2.2.1 变量
下一篇:2.2.3 基本引用类型
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站