cao*_*ang 1 c++ pointers integer casting c-preprocessor
我正在学习使用C++进行投射,之后的代码对我来说是神奇的.
#include <iostream>
using namespace std;
class Base {
public:
virtual void f() { }
};
#define SOME_VALUE 8
int main() {
cout << SOME_VALUE <<endl;
getchar();
}
Run Code Online (Sandbox Code Playgroud)
输出是:8
代码很简单,但SOME_VALUE是什么类型的?int,或double还是char?
之后更复杂:
#include <iostream>
using namespace std;
class Base {
public:
virtual void f() { }
};
#define SOME_VALUE 8
int main() {
cout << (Base*)SOME_VALUE-SOME_VALUE <<endl;
getchar();
}
Run Code Online (Sandbox Code Playgroud)
输出为:FFFFFFE8
遵循此代码,我可以理解SOME_VALUE是数字类型.我也测试sizeof(SOME_VALUE),输出为4.但如果SOME_WHAT是数字,它如何更改为对象指针?对象指针如何减去整数?
#define是一个预处理器命令.它在代码编译之前得到评估.所有发生的事情是主函数中的SOME_VALUE将文本替换为文本SOME_VALUE定义为.那是8.
SOME_VALUE本身没有C++类型,因为它只在预处理之前存在.在预处理之后,C++程序中将不存在SOME_VALUE,您将只有一个字符值8,它是一个int.
对于第二个问题,转换为Base*使用C样式转换.只需将原始内存转换为目标类型,即可将任何内容转换为任何内容.因此,如果正在转换的内存与目标类型不匹配,则会非常危险.对于C++,我建议使用static_cast或reinterpret_cast来更明确地说明正在进行的内容.
我认为(Base*)SOME_VALUE最终将作为Base*到内存地址8.因此,这是一个指向Base对象的指针,该对象从内存中的第8个字节开始.在内存中的位置8可能没有Base对象,因此它实际上并不是非常有用.然后" - 8"消除了Base*类型大小的8倍.在32位计算机上,指针是32位或4字节.所以,8 - (4*8)= -24十进制,这是十六进制的FFFFFFE8.
如果你想知道为什么计算机将负数表示为大数字,那就是另一个问题.从这里开始:http://en.wikipedia.org/wiki/Signed_number_representations