c ++或java中类型转换和类型转换有什么区别?

时间:2010-10-29 06:40:29

标签: java c++ casting

c ++或java中的类型转换和类型转换有什么区别?

8 个答案:

答案 0 :(得分:18)

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

输入 转化 实际上正在执行该值的转化。

在许多语言中,某些强制转换(通常为数字)会导致转换(这会因语言的不同而有所不同),但大多数只是“将此X视为Y”。 / p>

与人类语言的大多数方面一样,不幸的是,这些术语在不同的社区中使用的方式略有不同,主要是语言线。例如,请参阅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);

答案 1 :(得分:9)

类型转换只是用笔在变量上写“现在是一个int”,转换实际上是将内容转换为所需的类型,因此值仍然有意义。

答案 2 :(得分:9)

也许一个例子可以帮助:

  • 如果您将 33投射到字符串,则会获得"!"
  • 如果您 33转换为字符串,则会获得"33"

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

答案 3 :(得分:6)

类型转换:

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

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

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

答案 4 :(得分:5)

这些术语经常互换使用。

<强>爪哇

类型转换和类型转换在Java中是相同的,但如果有人说它们正在转换,它们通常指的是显式转换。

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

<强> C ++

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

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

请注意,c样式的强制转换语法(看起来与Java语法完全相同)是一种不一定会调用转换代码的强制转换。

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

答案 5 :(得分:4)

根据维基百科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).

答案 6 :(得分:0)

从对象到基元 - &gt;类型转换

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

从原语到对象 - &gt;类型转换

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

从原语到原语(或从对象到对象) - &gt;类型转换(缩小时显式,扩展时隐式)

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

注意:如果是对象类型转换,我们不能使用子类引用来保存父对象

答案 7 :(得分:0)

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

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

要考虑更多细节,首先(没有信息和精度损失),可以在没有信息和精度损失的情况下进行转换。这些转换包括:字节到短,字节到整数,字符到整数,整数到长整数,整数到双精度,最后浮点到双精度。例如:

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