3

好的,所以我尝试这样做

 int b;
 char x = 'a';

//Case 1    
b = static_cast<int>(x); 
std::cout<<"B is : "<<b<<std::endl;

//Case 2
b = *(int*)&x;   
std::cout<<"B is changed as  :: "<< b <<std::endl;

现在我知道,在案例 2 中,第一个字节x被重新解释为认为它是一个整数,并且位模式被复制到b其中给出了一些垃圾,而在案例 1 中,它只是将值从 转换charint

除此之外,这两者之间有什么区别吗?

4

3 回答 3

12

第一个只是转换值:int b = x;int b = static_cast<int>(x);.

第二种情况假装int在实际生活的地方有x生活,然后尝试阅读int。这是完全未定义的行为。(例如, anint可能比 a 占用更多空间char,或者可能是char居住在一个没有int人可以居住的地址。)

于 2012-12-06T22:16:18.170 回答
2

第 2 种情况是 C 风格转换(由 bhuang3 标识),但它不是与第 1 种情况等效的 C 风格。那将是 b = (int)x;. 情况 2 的 C++ 等价物将是b = *reinterpret_cast<int*>(&x); 无论你怎么做,情况 2 都是未定义的行为,因为 x 占用一个字节,而在 x 的地址处强制读取 int 的数据值会给你一个分段错误(某些总线错误系统)如果它不在 a 的合法地址int,或者它只会读取接下来的 3 个字节,我们不知道它们的值是什么。因此,正如您所观察到的,它显示为“垃圾”。

于 2012-12-06T22:25:11.873 回答
0
  1. static_cast不提供运行时检查,如果您知道您引用了特定类型的对象,则使用该检查。

  2. 第二个案例实际上是c-style cast

于 2012-12-06T22:21:38.070 回答