C++ 如何理解这个陌生的角色? 包括 int main{ __int64 a=uuu int64J\x10; 返回0; }

C++ 如何理解这个陌生的角色? 包括 int main{ __int64 a=uuu int64J\x10; 返回0; },c++,C++,当我运行它时,结果是a=12950320 如何理解,S.In 64 J\x10?< P> J\X10是一个字符串两个字符,这里是j和Hea10,默认情况下C++被认为是conchch*。 您正在尝试将const char*强制转换为_int64值,并将其存储在。我认为这是一个令人讨厌的演员阵容 将此代码运行几次将向您显示指针可能会随着执行的不同而变化,它可能会显示为相同的,这只是由于OS缓存的缘故 需要考虑的另一件事是,_int64不是标准类型,而是MS类型。J\x10是字符串文本。字符串文字是

当我运行它时,结果是a=12950320

如何理解,S.In 64 J\x10?

< P> J\X10是一个字符串两个字符,这里是j和Hea10,默认情况下C++被认为是conchch*。 您正在尝试将const char*强制转换为_int64值,并将其存储在。我认为这是一个令人讨厌的演员阵容

将此代码运行几次将向您显示指针可能会随着执行的不同而变化,它可能会显示为相同的,这只是由于OS缓存的缘故

需要考虑的另一件事是,_int64不是标准类型,而是MS类型。

J\x10是字符串文本。字符串文字是具有静态存储的字符数组

__int64可能是某种类型。根据名称,我们可以假定它是某种实现定义的非标准1 64位宽有符号整数类型

表达式Texpression是一种显式类型转换,通俗地称为C样式转换。它对操作数表达式执行2个静态强制转换、重新解释强制转换或常量强制转换中的一个或组合。在本例中,表达式将字符串文字表达式的值转换为类型_int64

当使用字符串文字之类的数组值时,它会隐式转换为指向第一个元素的指针。这叫做腐烂。指针的值是存储对象的内存地址

因此,指向字符串文字的第一个字符的指针被转换为实现定义的整数类型。从指针到整数没有静态转换,所以这是一个重新解释转换。假设整数类型足够大,以表示指针存储在今天大多数系统中的值,但不是C++所保证的,则转换将地址值映射为以定义方式的某个整数值。 如果你仍然困惑:没关系;即使理解了它的功能,这个程序也没有多大意义

1这意味着使用这种类型使程序只能在支持这种特殊类型的有限系统集上使用

2通常建议避免使用C样式转换,而是使用您打算使用的特定转换之一。C样式转换通常会阻止编译器捕获明显的错误。此外,除非您确切知道它在您使用它的上下文中的作用以及其后果,否则不应使用reinterpret cast和const cast。

好吧,这是一个注释中提到的问题。在这种情况下,它在很大程度上依赖于程序员知道她/他在做什么以及转换所需的内存空间

假设我们有2个字节的内存,这2个字节的值是0:

int16_t memory = 0; // 16 bits is 2 bytes, 
+-----------+-----------+
| 0000-0000 | 0000-0000 |
+-----------+-----------+
现在,我们可以逐个字节读取这2个字节,也可以将其作为整个2字节值一起读取。现在让我们把它看作一个并集,并将2字节的内存空间想象成独立的空间

联合试验{ int16字节2; 整数字节[2]; char-chars[2]; }; 因此,当我们将20299的值输入到该并集时,我们可以执行下一步:

联合测试接头; sub.bytes2=20299;
你知道多少?尤其是C类型的类型转换,您应该始终将其视为代码中出现错误的红旗?我没有收到错误和警告这些类型的转换是告诉编译器执行通常会标记为错误的操作的一种方式,因此在这种情况下,您不太可能收到错误或警告。删除_uint64部分,编译器会抱怨。
+-----------+-----------+
|         20 299        |
+-----------+-----------+
|     79    |     75    |
+-----------+-----------+
|    'O'    |    'K'    |
+-----------+-----------+
union test{
        uint64_t val;
        char chars[8];
    };