C++ 数据类型强制转化的实现

C++常见类型主要为

// 一个字节等于 8 bit
[signed] int //字节数为 4
unsigned [int] //字节数为 4
short [int] //字节数 2
unsigned short [int] //字节数 2
long [int] //字节数 4
unsigned long [int] //字节数 4
[signed] char //字节数 1
unsigned char //字节数 1
float //字节数 4
double //字节数 8
long long [int] //字节数 8
unsigned long long [int] //字节数 8
size_t //字节数 4-8

如下 C++ 11代码

#include<bits/stdc++.h>
using namespace std;
int main(){
 // 高位转化为低位
 unsigned long x1 = pow(2,32)-1; // 无符号
 cout<<"实际存取数字:"<<x1<<endl;
 cout<<"利用长整型来存取实际数字:"<<long(x1)<<endl; // 溢出
 cout<<"利用整型来存取实际数字:"<<int(x1)<<endl; // 溢出
 cout<<"利用字符型来存取实际数字:"<<char(x1)<<endl; // 溢出 输出为空格 字符 

 cout<<"------------------------------------------"<<endl;
 // 低位转化为高位
 char x2 = pow(2,7)-1; // 有符号
 cout<<"实际存取字符:"<<x2<<endl; // 输出为空格 ASCII码
 cout<<"利用无符号字符型来存取实际字符:"<<(unsigned char)(x2)<<endl; // 输出为空格 ASCII码
 cout<<"利用短整型来存取实际数字:"<<short(x2)<<endl;
 cout<<"利用整型来存取实际数字:"<<int(x2)<<endl;
 cout<<"利用无符号长整型来存取实际数字:"<<(unsigned int)(x2)<<endl;
 cout<<"利用无符号长整型来存取实际数字:"<<(unsigned long)(x2)<<endl;
 cout<<"利用单精度浮点型来存取实际数字:"<<float(x2)<<endl;
 cout<<"利用双精度浮点型来存取实际数字:"<<double(x2)<<endl;
 // 更高范围的整数类型转化
 cout<<"利用长长整型来存取实际数字:"<<(long long)(pow(2,62)-1)<<endl;
 cout<<"利用无符号长长整型来存取实际数字:"<<(unsigned long long)(pow(2,63)-1)<<endl;
 // 特殊类型强制转化
 cout<<"利用size_t类型来存取x1:"<<size_t(x1)<<endl;
 cout<<"利用size_t类型来存取x2:"<<size_t(x2)<<endl;
 cout<<"利用size_t类型来存取 x1+1 : "<<size_t(x1+1)<<endl; // 溢出
 cout<<"利用size_t类型来存取 -1 : "<<size_t(-1)<<endl; // 溢出
 return 0;
}

结果如下:

C++ 4种强制类型转换:

在C++语言中新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast。这四个关键字都是用于强制类型转换的。

新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。

C++中风格是static_cast<type>(content)。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。

1) static_cast

在C++语言中static_cast用于数据类型的强制转换,强制将一种数据类型转换为另一种数据类型。例如将整型数据转换为浮点型数据。
[例1]C语言所采用的类型转换方式:

int a = 10;
int b = 3;
double result = (double)a / (double)b;

例1中将整型变量a和b转换为双精度浮点型,然后相除。在C++语言中,我们可以采用static_cast关键字来进行强制类型转换,如下所示。
[例2]static_cast关键字的使用:

int a = 10;
int b = 3;
double result = static_cast<double>(a) / static_cast<double>(b);

在本例中同样是将整型变量a转换为双精度浮点型。采用static_cast进行强制数据类型转换时,将想要转换成的数据类型放到尖括号中,将待转换的变量或表达式放在元括号中,其格式可以概括为如下形式:

用法:static_cast <类型说明符> (变量或表达式)

它主要有如下几种用法:
    (1)用于类层次结构中基类和派生类之间指针或引用的转换
      进行上行转换(把派生类的指针或引用转换成基类表示)是安全的
      进行下行转换(把基类的指针或引用转换为派生类表示),由于没有动态类型检查,所以是不安全的
    (2)用于基本数据类型之间的转换,如把int转换成char。这种转换的安全也要开发人员来保证
    (3)把空指针转换成目标类型的空指针
    (4)把任何类型的表达式转换为void类型
    注意:static_cast不能转换掉expression的const、volitale或者__unaligned属性。

static_cast:可以实现C++中内置基本数据类型之间的相互转换。

如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数。

2) const_cast

在C语言中,const限定符通常被用来限定变量,用于表示该变量的值不能被修改。

而const_cast则正是用于强制去掉这种不能被修改的常数特性,但需要特别注意的是const_cast不是用于去除变量的常量性,而是去除指向常数对象的指针或引用的常量性,其去除常量性的对象必须为指针或引用。

用法:const_cast<type_id> (expression)
    该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
    常量指针被转化成非常量指针,并且仍然指向原来的对象;
    常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。

[例3]一个错误的例子:

const int a = 10;
const int * p = &a; *p = 20; //compile error int b = const_cast<int>(a); //compile error

在本例中出现了两个编译错误,第一个编译错误是*p因为具有常量性,其值是不能被修改的;另一处错误是const_cast强制转换对象必须为指针或引用,而例3中为一个变量,这是不允许的!

[例4]const_cast关键字的使用

#include<iostream>
using namespace std;

int main()
{
 const int a = 10;
 const int * p = &a;
 int *q;
 q = const_cast<int *>(p);
 *q = 20; //fine
 cout <<a<<" "<<*p<<" "<<*q<<endl;
  cout <<&a<<" "<<p<<" "<<q<<endl;
 return 0;
}

在本例中,我们将变量a声明为常量变量,同时声明了一个const指针指向该变量(此时如果声明一个普通指针指向该常量变量的话是不允许的,Visual Studio 2010编译器会报错)。

之后我们定义了一个普通的指针*q。将p指针通过const_cast去掉其常量性,并赋给q指针。之后我再修改q指针所指地址的值时,这是不会有问题的。

最后将结果打印出来,运行结果如下:
10 20 20
002CFAF4 002CFAF4 002CFAF4

查看运行结果,问题来了,指针p和指针q都是指向a变量的,指向地址相同,而且经过调试发现002CFAF4地址内的值确实由10被修改成了20,这是怎么一回事呢?为什么a的值打印出来还是10呢?

其实这是一件好事,我们要庆幸a变量最终的值没有变成20!变量a一开始就被声明为一个常量变量,不管后面的程序怎么处理,它就是一个常量,就是不会变化的。试想一下如果这个变量a最终变成了20会有什么后果呢?对于这些简短的程序而言,如果最后a变成了20,我们会一眼看出是q指针修改了,但是一旦一个项目工程非常庞大的时候,在程序某个地方出现了一个q这样的指针,它可以修改常量a,这是一件很可怕的事情的,可以说是一个程序的漏洞,毕竟将变量a声明为常量就是不希望修改它,如果后面能修改,这就太恐怖了。

在例4中我们称“*q=20”语句为未定义行为语句,所谓的未定义行为是指在标准的C++规范中并没有明确规定这种语句的具体行为,该语句的具体行为由编译器来自行决定如何处理。对于这种未定义行为的语句我们应该尽量予以避免!

从例4中我们可以看出我们是不想修改变量a的值的,既然如此,定义一个const_cast关键字强制去掉指针的常量性到底有什么用呢?我们接着来看下面的例子。

例5:

#include<iostream>
using namespace std;

const int * Search(const int * a, int n, int val);

int main()
{
 int a[10] = {0,1,2,3,4,5,6,7,8,9};
 int val = 5;
 int *p;
 p = const_cast<int *>(Search(a, 10, val));
 if(p == NULL)
  cout<<"Not found the val in array a"<<endl;
 else
  cout<<"hvae found the val in array a and the val = "<<*p<<endl;
 return 0;
}

const int * Search(const int * a, int n, int val)
{
 int i;
 for(i=0; i<n; i++)
 {
  if(a[i] == val)
   return &a[i];
 }
 return NULL;
}

在例5中我们定义了一个函数,用于在a数组中寻找val值,如果找到了就返回该值的地址,如果没有找到则返回NULL。函数Search返回值是const指针,当我们在a数组中找到了val值的时候,我们会返回val的地址,最关键的是a数组在main函数中并不是const,因此即使我们去掉返回值的常量性有可能会造成a数组被修改,但是这也依然是安全的。

对于引用,我们同样能使用const_cast来强制去掉常量性,如例6所示。

例6:

#include<iostream>
using namespace std;

const int & Search(const int * a, int n, int val);

int main()
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int val = 5;
int &p = const_cast<int &>(Search(a, 10, val));
if(p == NULL)
cout<<"Not found the val in array a"<<endl;
else
cout<<"hvae found the val in array a and the val = "<<p<<endl;
return 0;
}

const int & Search(const int * a, int n, int val)
{
int i;
for(i=0; i<n; i++)
{
if(a[i] == val)
return a[i];
}
return NULL;
}

了解了const_cast的使用场景后,可以知道使用const_cast通常是一种无奈之举,同时也建议大家在今后的C++程序设计过程中一定不要利用const_cast去掉指针或引用的常量性并且去修改原始变量的数值,这是一种非常不好的行为。

3) reinterpret_cast

在C++语言中,reinterpret_cast主要有三种强制转换用途:改变指针或引用的类型、将指针或引用转换为一个足够长度的整形、将整型转换为指针或引用类型。

用法:reinterpret_cast<type_id> (expression)
    type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。
    它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
    在使用reinterpret_cast强制转换过程仅仅只是比特位的拷贝,因此在使用过程中需要特别谨慎!

例7:

int *a = new int;
double *d = reinterpret_cast<double *>(a);

在例7中,将整型指针通过reinterpret_cast强制转换成了双精度浮点型指针。
reinterpret_cast可以将指针或引用转换为一个足够长度的整形,此中的足够长度具体长度需要多少则取决于操作系统,如果是32位的操作系统,就需要4个字节及以上的整型,如果是64位的操作系统则需要8个字节及以上的整型。

4) dynamic_cast

用法:dynamic_cast<type_id> (expression)

(1)其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。

(2)不能用于内置的基本数据类型的强制转换。

(3)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。

(4)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。

B中需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。

这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见<Inside c++ object model>)中,
        只有定义了虚函数的类才有虚函数表。

(5)在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

向上转换,即为子类指针指向父类指针(一般不会出问题);向下转换,即将父类指针转化子类指针。

向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。

在C++中,编译期的类型转换有可能会在运行时出现错误,特别是涉及到类对象的指针或引用操作时,更容易产生错误。Dynamic_cast操作符则可以在运行期对可能产生问题的类型转换进行测试。

例1:

#include<iostream>
using namespace std;

class base
{
public :
 void m(){cout<<"m"<<endl;}
};

class derived : public base
{
public:
 void f(){cout<<"f"<<endl;}
};

int main()
{
 derived * p;
 p = new base;
 p = static_cast<derived *>(new base);
 p->m();
 p->f();
 return 0;
}

本例中定义了两个类:base类和derived类,这两个类构成继承关系。在base类中定义了m函数,derived类中定义了f函数。在前面介绍多态时,我们一直是用基类指针指向派生类或基类对象,而本例则不同了。

本例主函数中定义的是一个派生类指针,当我们将其指向一个基类对象时,这是错误的,会导致编译错误。

但是通过强制类型转换我们可以将派生类指针指向一个基类对象,p = static_cast<derived *>(new base);语句实现的就是这样一个功能,这样的一种强制类型转换时合乎C++语法规定的,但是是非常不明智的,它会带来一定的危险。

在程序中p是一个派生类对象,我们将其强制指向一个基类对象,首先通过p指针调用m函数,因为基类中包含有m函数,这一句没有问题,之后通过p指针调用f函数。一般来讲,因为p指针是一个派生类类型的指针,而派生类中拥有f函数,因此p->f();这一语句不会有问题,但是本例中p指针指向的确实基类的对象,而基类中并没有声明f函数,虽然p->f();这一语句虽然仍没有语法错误,但是它却产生了一个运行时的错误。换言之,p指针是派生类指针,这表明程序设计人员可以通过p指针调用派生类的成员函数f,但是在实际的程序设计过程中却误将p指针指向了一个基类对象,这就导致了一个运行期错误。

产生这种运行期的错误原因在于static_cast强制类型转换时并不具有保证类型安全的功能,而C++提供的dynamic_cast却能解决这一问题,dynamic_cast可以在程序运行时检测类型转换是否类型安全。

当然dynamic_cast使用起来也是有条件的,它要求所转换的操作数必须包含多态类类型(即至少包含一个虚函数的类)。

例2:

#include<iostream>
using namespace std;

class base
{
public :
 void m(){cout<<"m"<<endl;}
};

class derived : public base
{
public:
 void f(){cout<<"f"<<endl;}
};

int main()
{
 derived * p;
 p = new base;
 p = dynamic_cast<derived *>(new base);
 p->m();
 p->f();
 return 0;
}

在本例中利用dynamic_cast进行强制类型转换,但是因为base类中并不存在虚函数,因此p = dynamic_cast<derived *>(new base);这一句会编译错误。

为了解决本例中的语法错误,我们可以将base类中的函数m声明为虚函数,virtual void m(){cout<<"m"<<endl;}。

dynamic_cast还要求<>内部所描述的目标类型必须为指针或引用。

例3:

#include<iostream>
#include<cstring>

using namespace std;

class A
{
 public:
 virtual void f()
 {
  cout<<"hello"<<endl;
  };
};

class B:public A
{
 public:
 void f()
 {
  cout<<"hello2"<<endl;
  };

};

class C
{
 void pp()
 {
  return;
 }
};

int fun()
{
 return 1;
}

int main()
{
 A* a1=new B;//a1是A类型的指针指向一个B类型的对象
 A* a2=new A;//a2是A类型的指针指向一个A类型的对象
 B* b;
 C* c;
 b=dynamic_cast<B*>(a1);//结果为not null,向下转换成功,a1之前指向的就是B类型的对象,所以可以转换成B类型的指针。
 if(b==NULL)
 {
  cout<<"null"<<endl;
 }

 else
 {
  cout<<"not null"<<endl;
 }

 b=dynamic_cast<B*>(a2);//结果为null,向下转换失败
 if(b==NULL)
 {
  cout<<"null"<<endl;
 }

 else
 {
  cout<<"not null"<<endl;
 }

 c=dynamic_cast<C*>(a);//结果为null,向下转换失败
 if(c==NULL)
 {
  cout<<"null"<<endl;
 }

 else
 {
  cout<<"not null"<<endl;
 }

 delete(a);
 return 0;
}

到此这篇关于C++ 数据类型强制转化的实现的文章就介绍到这了,更多相关C++ 数据类型强制转化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++中指针的数据类型和运算相关知识小结

    C++有关指针的数据类型和指针运算的小结 前面已用过一些指针运算(如p++,p+i等),现在把全部的指针运算列出如下. 1) 指针变量加/减 一个整数 例如:p++,p--,p+i,p-i,p+-i,p-=i等. C++规定,一个指针变量加/减一个整数是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数相加或相减.如p+i代表这样的地址计算:p+i*d,d为p所指向的变量单元所占用的字节数.这样才能保证p+i指向p下面的第i个元素. 2) 指针变量赋值 将一个变量地址赋给一个指

  • 浅谈C++的语句语法与强制数据类型转换

    一个程序包含一个或多个程序单位(每个程序单位构成一个程序文件).每一个程序单位由以下几个部分组成: 预处理命令.如#include命令和#define命令. 声明部分.例如对数据类型和函数的声明,以及对变量的定义. 函数.包括函数首部和函数体,在函数体中可以包含若干声明语句和执行语句. 如下面是一个完整的C++程序: #include <iostream>//预处理命令 using namespace std; //在函数之外的声明部分 int a=3; //在函数之外的声明部分 int ma

  • C和C++中的基本数据类型的大小及表示范围详解

    本文研究的主要问题时关于C和C++中的基本数据类型int.long.long long.float.double.char.string的大小及表示范围,具体介绍如下. 一.基本类型的大小及范围的总结(以下所讲都是默认在32位操作系统下): 字节:byte:位:bit. 1.短整型short:所占内存大小:2byte=16bit: 所能表示范围:-32768~32767:(即-2^15~2^15-1) 2.整型int:所占内存大小:4byte=32bit: 所能表示范围:-2147483648~

  • C++编程中的数据类型和常量学习教程

    C++数据类型 计算机处理的对象是数据,而数据是以某种特定的形式存在的(例如整数.浮点数.字符等形式).不同的数据之间往往还存在某些联系(例如由若干个整数组成一个整数数组).数据结构指的是数据的组织形式.例如,数组就是一种数据结构.不同的计算机语言所允许使用的数据结构是不同的.处理同一类问题,如果数据结构不同,算法也会不同.例如,对10个整数排序和对包含10个元素的整型数组排序的算法是不同的. C++的数据包括常量与变量,常量与变量都具有类型.由以上这些数据类型还可以构成更复杂的数据结构.例如利

  • Visual C++ 常用数据类型转换方法详解第1/2页

    说明:本文纯粹是总结一下有关类型转换的贴子, 本人并未对所有方法都做测试,仅仅是为了给大家一个参考. 读者层次:初学 int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username[]="程佩君"; char temp[200]; char *buf; CString str; _variant_t v1; _bstr_t v2; 一.其它数据类型转换为字符串 短整型(int) itoa(i,te

  • 深入讲解C++数据类型转换的相关函数的知识

    C++数据类型转换以及转换构造函数 标准数据类型之间的转换 在C++中,某些不同类型数据之间可以自动转换,例如 int i = 6; i = 7.5 + i; 编译系统对 7.5是作为double型数处理的,在求解表达式时,先将6转换成double型,然后与7.5相加,得到和为13.5,在向整型变量i赋值时,将13.5转换为整数13,然后赋给i.这种转换是由C++编译系统自动完成的,用户不需干预.这种转换称为隐式类型转换. C++还提供显式类型转换,程序人员在程序中指定将一种指定的数据转换成另一

  • 解决易语言转换到C++ 自定义数据类型

    自定义数据类型如下 .版本 2 .数据类型 数据 .成员 坐标, 坐标_数据类型 .数据类型 坐标_数据类型 .成员 x, 小数型 .成员 z, 小数型 .成员 y, 小数型 这里的自定义数据类型下的"数据"类型下的"坐标"成员引用自定义数据类型"坐标_数据类型" 子程序如下 .版本 2 .子程序 自己数据 .参数 返回数据, 数据, 参考 返回数据.坐标.x = 1 返回数据.坐标.z = 2 返回数据.坐标.y = 3 这里的子程序内的参数&

  • C++学习小结之数据类型及转换方式

    一.输入输出语句 Console.ReadLine(); 会等待直到用户按下回车,一次读入一行 Console.ReadKey(); 则是等待用户按下任意键,一次读入一个字符. 二.数据类型 主要掌握: 1.值类型:int 整型,float 浮点型(单精度), double 双精度,char 字符型,bool 布尔型(两种状态true与false),datetime  日期时间 2.引用类型:string 字符串类型 问题? a.字符串与字符的区别:string类型使用 "",char

  • C++ 数据类型强制转化的实现

    C++常见类型主要为 // 一个字节等于 8 bit [signed] int //字节数为 4 unsigned [int] //字节数为 4 short [int] //字节数 2 unsigned short [int] //字节数 2 long [int] //字节数 4 unsigned long [int] //字节数 4 [signed] char //字节数 1 unsigned char //字节数 1 float //字节数 4 double //字节数 8 long lon

  • python数据类型强制转换实例详解

    1.字符强转一切 如果是字符串进行强制转换, 仅仅就是在原数据类型的两边套上引号 2.list : 强制转换成列表 """ 如果是字符串,会把每一个字符都单独作为一个元素放到新的列表中 如果是字典,只保留键,形成一套新的列表. 如果是其他容器,只是单纯的在原数据的两边套上[] """ res = list(tuplevar) res = list(setvar) res = list(strvar) res = list(dictvar) # 把

  • PHP强制转化的形式整理

    PHP强制转化有几种形式 PHP强制转化有3种形式:1.在要转换的变量之前加上用括号括起来的目标类型:2.使用转强函数,如"intval()","strval()":3.使用"settype()"函数,只需将要转换的变量传入第一个参数并将第二参数传入数据类型名即可. 示例代码 $a = '12'; $res = (int)$a; var_dump($a); //原变量不影响 var_dump($res);//返回的值为整型 $a = '12';

  • pytorch中tensor张量数据类型的转化方式

    1.tensor张量与numpy相互转换 tensor ----->numpy import torch a=torch.ones([2,5]) tensor([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]) # ********************************** b=a.numpy() array([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]], dtype=float32) numpy --

  • python 数据类型强制转换的总结

    数据类型的强制转换 如果要将一个数据转换成另一个数据类型,只需要将其放入相应类型的函数中去. Number类型的数据转换 强制转换为int 可以转换的数据类型 int 整型 float 浮点型 bool 布尔型 str 字符串(整型) 数据转换 # 整型(整型转换是原封不动的) print(int(10)) # 浮点型(浮点型转成整型按照退一法) print(int(10.999)) # 布尔型(布尔型只有两种值,转换成为整型也只有两种,True=1,False=0) print(int(Tru

  • js中int和string数据类型互相转化实例

    在javascript里怎么样才能把int型转换成string型 (1) var x=100 a = x.toString() (2) var x=100; a = x +""; //JS会自动隐性转换 javascript   将string 变成 int JScript var s = "32" var i = new Number(s) parseInt() parseInt() 例如: parseInt("abc") // Returns

  • MySQL函数大全及用法示例分享

    字符串函数 ASCII(str)   返回字符串str的第一个字符的ASCII值(str是空串时返回0)  mysql> select ASCII('2');  -> 50  mysql> select ASCII(2);  -> 50  mysql> select ASCII('dete');  -> 100 ORD(str) 如果字符串str句首是单字节返回与ASCII()函数返回的相同值. 如果是一个多字节字符,以格式返回((first byte ASCII co

  • PHP数据类型的总结分析

    PHP共有8中数据类型: 类型名称 类型表示 取值 bool 布尔型 true,false integer 整型 -2147483647-2147483648 string 字符串型 字符串长度取决于机器内存 float 浮点型 最大值1.8e308 object 对象 通过new实例化 $obj=new person(); array 数组类型 $arr=array(1,2,3,4,5,6);//一维数组 resourse null 空值 null布尔型bool :对于其他类型我们可以使用(b

  • 浅析JavaScript中的特殊数据类型

    在JavaScript中,有6大数据类型,分别包括string,number,boolean,undefined,null 和 object 一.JS中的特殊类型:NaN NaN 即Not a Number , 不是一个数字, 那么NaN到底是什么呢? 而对于JS来说,整数和浮点数都统称为number 类型,除此之外,number 类型还有一个很特殊的值,即NaN,它是用来表示是否属于number 类型的一种状态,而不是一个确切的值(所以,NaN不等于自身). 那么,NaN值一般会在什么情况下出

  • Java基本数据类型与类型转换实例分析

    本文实例讲述了Java基本数据类型与类型转换.分享给大家供大家参考,具体如下: 相关内容: 基本数据类型 整型 浮点型 字符型 布尔型 数据类型转换 数组 首发时间:2017-06-22 21:18 修改时间: 2018-03-16 15:40  :修改了一下文字布局和样式,增加了"相关内容",修改了标题,增加了数组 数据类型: Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间 注意: 整数默认类型为:int,所以 1 2 3 为in

随机推荐