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)
没有演员表,你只是告诉cout你想要在字符串文字"mamut"减去8个字节的地址处打印字符串.你正在做指针运算.然后,cout将打印发生在该地址的任何内容,或者可能崩溃和刻录,因为访问数组超出界限会导致未定义的行为.
编辑
关于op的编辑:将地址转换为int不一定导致与地址相同的正确数字.地址不一定适合于int其中,int是一种有符号的类型,并且在签名类型中存储地址没有任何意义.
为了保证从指针到整数的转换而没有损失,您需要使用uintptr_tstdint.h.
引用C标准6.3.2.3(我相信在这种情况下C++是相同的):
任何指针类型都可以转换为整数类型.除非先前指定,否则结果是实现定义的.如果结果无法以整数类型表示,则行为未定义.结果不必在任何整数类型的值范围内.