static_cast <int>(var)和*(int *)&amp; var?</int>之间的区别是什么?

时间:2012-12-06 22:13:21

标签: c++ type-conversion static-cast

好的,所以我试着这样做

 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中它只需将char的值转换为int即可。

除此之外,这两者有什么不同吗?

3 个答案:

答案 0 :(得分:12)

第一个只转换价值:int b = x;int b = static_cast<int>(x);相同。

第二种情况假装int生活在实际上x生活的地方,然后尝试阅读int。这是彻头彻尾的未定义行为。 (例如,int可能会占用比char更多的空间,或者char可能位于没有int可以居住的地址。)< / p>

答案 1 :(得分:2)

第二种情况是C风格的演员(由bhuang3确定),但它不是C风格的等同于案例1.那将是 b = (int)x;。情况2的C ++等价物将是b = *reinterpret_cast<int*>(&x);无论你采用哪种方式,情况2都是未定义的行为,因为x占用一个字节,而在x的地址强行读取int的数据将导致分段错误(某些系统上的总线错误)如果它不在int的合法地址,或者它只读取接下来的3个字节,其值我们不知道它们是什么。因此,它会在你观察到的时候读出“垃圾”。

答案 2 :(得分:0)

  1. static_cast不提供运行时检查,如果您知道引用特定类型的对象,则会使用该检查。

  2. seconde案例实际上是c-style cast