C++ 或 Java 中的类型转换和类型转换有啥区别?

Posted

技术标签:

【中文标题】C++ 或 Java 中的类型转换和类型转换有啥区别?【英文标题】:What is the difference between type casting and type conversion in C++ or Java?C++ 或 Java 中的类型转换和类型转换有什么区别? 【发布时间】:2011-05-02 06:21:06 【问题描述】:

C++ 或 Java 中的类型转换和类型转换有什么区别?

【问题讨论】:

【参考方案1】:

类型转换只是拿笔在变量上写“这现在是一个int”,转换实际上是将内容转换为所需的类型,以便值保持有意义。

【讨论】:

【参考方案2】:

类型 casting 将变量引用的值(内存块)视为与声明变量的类型不同的类型。

类型 conversion 实际上是在执行该值的转换。

在许多语言中,一些 类型转换(通常是数字类型)确实会导致转换(这会因语言而异),但大多数情况下只是“将此 X 视为 Y”。

与人类语言的大多数方面一样,不幸的是,这些术语在不同社区中的使用略有不同,主要是沿语言线。例如,请参阅下面 James 关于 C++ 的评论——“cast”一词的含义比上面的定义要广泛得多,后者更多地属于 C 或 Java 模型。为了让事情变得有趣,Java 语言规范实际上涉及到各种类型的转换,包括casting conversions。但以上是一个很好的经验法则。

但举个简单的例子:

在 Java 中,在泛型之前,在处理地图时必须进行大量的类型转换是很正常的:

Map m = new HashMap();
m.put("one", "uno");

// This would give a compiler error, because although we know
// we'll get a String back, all the compiler knows is that it's
// an Object
String italian = m.get("one");

// This works, we're telling the compiler "trust me, it's a String"
String italian = (String)m.get("one");

幸运的是,添加 generics 解决了这个问题,因为以这种方式铸造往往是一个脆弱的过程,存在维护问题。

相比之下,如果你有一个数字字符串,你会转换

String s = "1234";

...并且需要知道这些数字以十进制表示的数字:

// Wrong (cast)
int n = (int)s;

// Right (conversion)
int n = Integer.parseInt(s, 10);

【讨论】:

能否请您提供类型转换和类型转换的示例? @Jagan:奇怪的是,我就是这么做的。 :-) 至少在 C++ 中,cast 一词的使用并不受此限制;有几种(四种)类型的演员表。重新解释只是其中之一,也是最不常用的。 @James:至少在精心设计的高级代码中“最不常用”。 迄今为止我在任何社区中看到的关于此主题的最佳答案 :)【参考方案3】:

根据***article:

“在 C 语言家族中,单词 cast 通常指的是显式类型转换(与隐式转换相反),无论这是对位模式的重新解释还是真正的转换。”

这是一个 C++ 示例:

double d = 42.0;
int i = d; // Here you have an implicit conversion from double to int
int j = static_cast<int>(d); // Here you have a cast (explicit conversion).

这是一个 Java 示例(请注意,在 Java 中,与 C++ 不同,您不能将 double 隐式转换为 int):

int i = 42;
double d = i; // Here you have an implicit conversion from int to double
int j = (int)d; // Here you have a cast (explicit conversion).

【讨论】:

【参考方案4】:

类型转换:

double value = 3; // implicit conversion to double value 3.0
int nValue = 3.14156; // implicit conversion to integer value 3

强制转换是程序员要求进行显式类型转换的请求。

int nValue = 10;
double dvalue = double(nValue); // explicit type casting

【讨论】:

【参考方案5】:

这些术语经常互换使用。

Java

类型转换和类型转换在 Java 中是一回事,但如果有人说他们正在转换,他们通常指的是显式转换。

Java 中的强制转换将在运行时完成,因此可能会失败(抛出异常)。某些类型的无效转换可以在编译时捕获。当转换失败时,实例位于 object 引用中,因此编译器无法判断将执行什么转换,直到它实际运行代码。

C++

类型转换和类型转换在 C++ 中是不同的。 C++ 中有五种类型的转换,它们都有不同的行为:static_castdynamic_castreinterpret_castconst_cast 和 c 样式转换 ((int)someVariable)。

一些 C++ 类型转换执行类型转换(因此这个概念令人困惑)、调用代码并可能执行运行时检查。其他 C++ 强制转换只是伪造引用变量的类型更改 - 不会修改、移动或复制内存,因此可能无法正确转换结果数据类型。这可以在运行时提供极快的速度,并且可以成为低级代码的强大工具,但对于高级代码往往会避免使用。

请注意,c 风格的强制转换语法(恰好看起来与 Java 语法完全一样)是不一定会调用转换代码的强制转换之一。

C++ 中的类型转换通常是指调用复制构造函数或赋值运算符,它将数据复制到不同类/结构的新实例。如果一个类型定义了转换运算符,那么转换语法可能看起来像一个强制转换,或者只是一个直接赋值。这里的主要区别是调用代码来进行转换。

【讨论】:

【参考方案6】:

也许一个例子可以帮助:

如果您将33转换为字符串,您将得到"!"。 如果将33转换为字符串,则会得到"33"

[注意:这个例子对数字和字符串的编码和内存表示做了各种不必要的假设,但我希望机制是清楚的。]

【讨论】:

【参考方案7】:

从对象到原始 -> 类型转换

String s = "1234";
int i = Integer.parseInt(s);
int j = Integer.valueOf(s);

从原始到对象 -> 类型转换

int i = 55;
String s = String.valueOf(i);
String t = Integer.toString(i);

从原始到原始(或对象到对象)-> 类型转换(缩小时显式,扩大时隐式)

//explicit  
double d = 3.14156;
int i = (int)d; 
//implicit
int i = 100;
double d = i;

注意:在对象类型转换的情况下,我们不能使用子类引用来保存父对象

【讨论】:

【参考方案8】:

如果你专注于 Java 和数字类型,根据 Javadoc,我认为类型转换和类型转换之间的主要区别是:

没有信息和精度损失(类型转换) 精度损失(类型转换) 信息丢失(类型转换)

考虑更多细节,首先(没有信息和精度损失),可以在没有信息和精度损失的情况下进行转换。这些转换包括:byte 到 short,short 到 int,char 到 int,int 到 long,int 到 double,最后是 float 到 double。例如:

byte b = 2;
System.out.println(b); 
short s = b; // without information and precision loss (type conversion)
System.out.println(s);

结果:

    2
    2

其次(精度损失),转换是在精度损失的情况下进行的,这意味着结果值具有正确的大小但是有精度损失。这些转换包括:int 到 float、long 到 float 和 long 到 double。例如:

long l = 1234567891;
System.out.println(l); 
double d = l; // precision loss (type conversion)
System.out.println(d);

结果:

    1234567891
    1.234567891E9

第三(信息丢失),转换是通过信息丢失完成的,这意味着您正在转换值,因此它有自己的语法。这些转换包括:double 到 long,double 到 int 等等。例如:

double d = 1.2;
System.out.println(d); 
long l = (long) d; // information loss
System.out.println(l);

结果(小数部分省略):

    1.2
    1

【讨论】:

以上是关于C++ 或 Java 中的类型转换和类型转换有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

java中的 class<T>和 class<?>类型 有啥区别,可以互相转换来用吗?是好举例来说明一下

Java有啥方法可以将string转换为指定类型的方法不

c++有混合类型吗

C++ 中的类型转换和指针类型转换

C++ 错误:'(' 标记之前的预期构造函数、析构函数或类型转换

Oracle sql中的隐式和显式数据类型转换有啥区别