好的,所以我试着这样做
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
即可。
除此之外,这两者有什么不同吗?
答案 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)
static_cast
不提供运行时检查,如果您知道引用特定类型的对象,则会使用该检查。
seconde案例实际上是c-style cast