const char*to int cast?

lig*_*ulb 0 c++ int casting char

我想以下片段的行为应该是未定义的,但我只是想确保我理解正确的事情.假设我们有这个代码:

#include <iostream>

int main()
{
  std::cout << "mamut" - 8 << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

因此,我认为这样做是(字符*)((INT)(为const char*) - (INT)),但在此之后的输出是非常奇怪的,不是我期望它做任何真正意义上的.所以我的问题是关于char*和int之间的转换 - 它是未定义的,还是背后有一些逻辑?

编辑:我只想补充一点:

#include <iostream>

int main ()
{
    const char* a = "mamut";
    int b = int(a);
    std::cout << b << std::endl;
    std::cout << &a <<std::endl;
    // seems b!= &a
    for( int i = 0; i<100;i++)
    {
        std::cout<<(const char*)((int)a - i)<<std::endl;
    }

    return 0;
 }
Run Code Online (Sandbox Code Playgroud)

在我变得足够大之后的输出给了我像_Jv_RegisterClasses等的东西.仅仅为了记录:

std::cout << a - i << std::endl;
Run Code Online (Sandbox Code Playgroud)

产生与以下相同的结果:

std::cout<<(const char*)((int)a - i)<<std::endl;
Run Code Online (Sandbox Code Playgroud)

Lun*_*din 5

没有演员表,你只是告诉cout你想要在字符串文字"mamut"减去8个字节的地址处打印字符串.你正在做指针运算.然后,cout将打印发生在该地址的任何内容,或者可能崩溃和刻录,因为访问数组超出界限会导致未定义的行为.

编辑

关于op的编辑:将地址转换为int不一定导致与地址相同的正确数字.地址不一定适合于int其中,int是一种有符号的类型,并且在签名类型中存储地址没有任何意义.

为了保证从指针到整数的转换而没有损失,您需要使用uintptr_tstdint.h.

引用C标准6.3.2.3(我相信在这种情况下C++是相同的):

任何指针类型都可以转换为整数类型.除非先前指定,否则结果是实现定义的.如果结果无法以整数类型表示,则行为未定义.结果不必在任何整数类型的值范围内.