型铸造和铸造之间有什么区别吗?类型转换?

时间:2009-09-03 15:58:28

标签: c++ type-conversion casting

铸造和铸造之间有什么区别吗? c ++中的类型转换。

4 个答案:

答案 0 :(得分:13)

通常,强制转换是指显式转换,无论是由C风格的强制转换(T(v)还是(T)v)还是C ++风格转换(static_castconst_castdynamic_castreinterpret_cast)。转换通常是一个更通用的术语,用于将变量转换为另一个变量的任何时间:

std::string s = "foo"; // Conversion from char[] to char* to std::string
int i = 4.3; // Conversion from float to int
float *f = reinterpret_cast<float*>(&i); // (illegal) conversion from int* to float*

答案 1 :(得分:2)

类型转换意味着您获取一串位并以不同方式解释它们。类型转换意味着您将一串位从一个上下文中有用的配置转换为另一个中有用的配置。

例如,假设我写

int x=65;
char c=(char) x;
char* s=(char*) x;

c现在将包含字符'A',因为如果我将十进制数字65重新解释为字符,我会得到字母'A'。 s现在将是一个指向驻留在内存位置65的字符串的指针。这几乎肯定是无用的事情,因为我不知道该内存位置是什么。

itoa(x, s, 10);

是类型转换。这应该给我字符串“65”。

也就是说,对于强制转换,我们仍在查看相同的内存位置。我们只是以不同的方式解释数据。通过转换,我们将生成从旧数据派生的新数据,但它与旧数据不同。

答案 2 :(得分:1)

使用字符串时会出现一个主要差异。你不能说(int)“234”并得到整数234.类型转换通常只适用于原始数值数据类型。

答案 3 :(得分:1)

类型转换可以进行最小量的转换:

signed char Schar; // 1 byte (8 bits) to hold 256 values: -128 to 127
unsigned char Uchar; // 1 byte (8 bits) to hold 256 values: 0 to 255
...
if ( Schar < -10  ) ... // compiler uses SIGNED comparision
Uchar = Schar; // implicit conversion only copies the 8 bits
Uchar = (char) Schar; // explicit conversion may be required by compiler
if ( Uchar > 200 ) ... // compiler uses UNSIGNED comparision
...OR...
if ( (unsigned char) Schar > 200 ) ... // explicit conversion for UNSIGNED comparision

short Sshort; // 2 bytes (16 bits) to hold 65536 values: -32768 to 32767
unsigned short Ushort; // 2 bytes (16 bits) to hold 65536 values: 0 to 65536
...
// when moving 8 bits into 16 bit variables, what to do with other 8 bits ?
Sshort = (signed short) Uchar; // move 8 bits over and use 0s for other 8 bits
Sshort = (signed short) Schar; // same, but use 1s if negative to make Sshort negative

但这可能被视为类型转换:

float dbl; // 4 bytes to store floating number in IEEE format
long lng;  // 4 bytes to store 32 bit integer value in 2's complement format
...
dbl = lng; // convert from 2's comp to IEEE format - all bits change !
dbl = (float) lng; // explicit form

注意:int通常与shortlong相同,具体取决于编译器/ CPU 注意:signed通常是可选的,因为这通常是默认的

当您指定所有变量占用相同的内存空间时,不会发生转换:

typedef union MYUNION // all members occupy same space (memory bytes)
{
  signed char Schar; // usual default for char
  unsigned char Uchar;
  signed short Sshort; // usual default for short
  unsigned short Ushort;
  signed long Slong; // usual default for long
  unsigned long Ulong;
  float flt;
  double dbl;
};

MYUNION myunion;

myunion.Schar = ... // set variable (memory byte) to value

if ( (unsigned char) myunion.Schar > 200 ) ... // unsigned compare works ok
... is same as (also without moving any data around) ...
if ( myunion.Uchar > 200 ) ... // unsigned compare works ok

... myunion.Sshort ... // other 8 bits are UNASSIGNED GARBAGE !

myunion.Sshort = myunion.Schar; // provide all 16 bits from Schar
... myunion.Sshort ... // Sshort of valid now

myunion.dbl = 12345.0;
... myunion.Ulong ... // has weird value from odd IEEE bit format

myunion.Ulong = (unsigned long) myunion.dbl; // do explicit conversion
... myunion.Ulong ... // has CONVERTED 12345 value

注意:*(unsigned long*)&dbl也会产生奇怪的值。它确实: a)获取双dbl的地址(位和字节的位置) b)将地址视为无符号长地址 c)从该位置获得无符号长度 当然,这种技术有一些实际的应用。示例:解析复杂的外部二进制文件或具有512字节内存的CPU等