Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态与静态之间的区别是什么<;int>;(var)和*(int*)&;变量?_C++_Type Conversion_Static Cast - Fatal编程技术网

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:可能会。但是这个技巧已经在一个功能测试良好的库中为您抽象出来了。或者,它是构建环境中内置的东西,因此已知是正确的,并且没有运行时成本。