C++ 静态与静态之间的区别是什么<;int>;(var)和*(int*)&;变量?
好吧,我试着这么做C++ 静态与静态之间的区别是什么<;int>;(var)和*(int*)&;变量?,c++,type-conversion,static-cast,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; intb; char x='a
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;
intb;
char x='a';
//案例1
b=静态_铸件(x);
std::cout第一个只转换值:intb=x代码>与intb=static_cast(x)相同代码>
第二个案例假设有一个int
居住在x
实际居住的地方,然后尝试读取该int
。这是完全没有定义的行为。(例如,int
可能比char
占用更多的空间,或者可能是char
位于int
无法生存的地址。)
static\u cast
不提供运行时检查,如果知道引用了特定类型的对象,则使用该检查
第二种情况实际上是c型演员
第二个案例是C型铸造(由bhuang3确定),但它不是与案例1相当的C型铸造。那就是
b=(int)x代码>。案例2的C++等价物是<代码> B= * RealTytReST(和X);<代码>无论采用哪种方式,情况2都是未定义的行为,因为x占用一个字节,而在x的地址强制读取一个int值的数据,如果它不在int
的合法地址,则会给您一个分段错误(某些系统上的总线错误),或者它只读取接下来的3个字节,我们不知道他们的价值观是什么。因此,正如您所观察到的,它读作“垃圾”。一个是未定义的行为,另一个不是。@phonetagger…..Case-2可以方便地找到机器的字节顺序。@noleptr-是的,有点像。但另一种方法是:在int位置读取一个字节。如上所述,如果在一个字节位置读取一个整型,如果它没有在整型边界上对齐,则可能会导致SEGV。@noleptr:Yes;但只有在使用长度至少与整数相同的字符数组时(否则代码将被破坏)。但是这些信息并没有那么有用,任何需要你知道这一点(字节顺序)的问题都已经以更好的方式解决了。@LokiAstari-你确定“更好的方式”的核心没有使用这样的技巧吗?@phonetagger:可能会。但是这个技巧已经在一个功能测试良好的库中为您抽象出来了。或者,它是构建环境中内置的东西,因此已知是正确的,并且没有运行时成本。