2012-12-06 392 views
3

行,所以我试着这样做static_cast <int>(var)和*(int *)&var之间的区别是什么?

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

除此之外,这两者之间是否有区别?

+11

一个是未定义的行为,另一个不是。 – Mysticial

回答

12

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

第二种情况假设生活在x居住的地方的int,然后尝试读取int。这完全是未定义的行为。 (例如,int可能比char占用更多的空间,或者它可能是在char生活在一个地址在没有int都不能活了。)

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

  2. 的Seconde系列案件实际上是c-style cast

2

的第二种情况是C样式转换(由bhuang3标识),但它不是C风格等效于case 1。这将是 b = (int)x;。情况2的C++等价物将是b = *reinterpret_cast<int*>(&x);无论采取哪种方式,情况2都是未定义的行为,因为x占用一个字节,而在x的地址处强制读取一个int值的数据将导致分段错误(总线错误开启一些系统),如果它不在int的合法地址中,或者它只是读取接下来的3个字节,其值我们不知道它们是什么。因此,它读取“垃圾”,如你所观察到的。

+0

@phonetagger .....情况-2可以方便地找到一台机器的字节顺序.... – Recker

+0

@noleptr - 是的,有点。但是相反:在int位置读取一个字节。如上所述,如果在int边界上未对齐,则在字节位置读取int可能为SEGV。 – phonetagger

+0

@noleptr:是的;但只有使用至少与整数一样长的char数组(否则代码被破坏)。但是这些信息并没有那么有用,任何需要你知道这个(字节顺序)的问题都已经以更好的方式解决了。 –

相关问题