关于C/C++里的类型转换,困惑我许久的问题... 对于32位的系统,int 与 long 是一样的都是4个字节!没有切割和提升! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 C++里有新的类型转换,你用的方法是C方法,C++是用static_cast<>,dynamic_cast<>等来进行类型转换的。 Phourm(): 哦,我是举个例子,明白我的意思就行了...vcmfc(菜虫): 我看到的绝大多数程序例子,现在都是这样转换啊... 能提升吗?好象只是切割而已!long a=(long)b; 有可能个a付一个错值(不一定等于b)!如果int 是2BYTE,long 是4BYTE,那么a的值高2两个BYTE的值不定!int b2=(int)a2;确实是切割!b2的值等与a2的底两个BYTE!明白了吗? jfzsl(剿匪总司令): 常量的这些我知道,但是 如果一个内存体比父类大的子类被切割成父类用,那会是什么结果? 如果一个内存体比子类小的父类被扩充成子类用,那会是什么结果? jfzsl(剿匪总司令):"long a=(long)b; 有可能个a付一个错值(不一定等于b)!"----a的低位会等于b,高位会是0,这是编译器做的,你这句不对吧? 如果一个内存体比父类大的子类被切割成父类用,那会是什么结果?->那会只有父类的成员!如果一个内存体比子类小的父类被扩充成子类用,那会是什么结果?——>有可能程序出错!----a的低位会等于b,高位会是0,这是编译器做的,你这句不对吧?——>是的!我错了,把指针和数据类型搞混了!不好意思!呵呵! jfzsl(剿匪总司令):如果一个内存体比父类大的子类被切割成父类用,那会是什么结果?->那会只有父类的成员!如果一个内存体比子类小的父类被扩充成子类用,那会是什么结果?——>有可能程序出错!这段void somefuc(CWND* pWnd){...}我们会常用CDialog/CView..的指针代入就是所谓的切割吧?为什么我们还能继续调用CDialg/CView的其他CWnd没有的成员函数?如果是提升,就是说把pWnd扩充成了子类指针,为什么不会出错.如果都不是提升或者扩充,编译器背后做了什么动作? void somefuc(CWND* pWnd){...}我们会常用CDialog/CView..的指针代入>就是所谓的切割吧?为什么我们还能继续调用CDialg/CView的其他CWnd没有的成员函数? 这不是切割,只是指针的强制类型转换,对保存有CDialog或者CView信息的内存体并没有改变。>如果是提升,就是说把pWnd扩充成了子类指针,为什么不会出错. 这也不是提升,我们经常强制转换某个pWnd到pDialog或者pView,是因为这个pWnd指向的内存体本身其实是CDialog*或者CView*。如果都不是提升或者扩充,编译器背后做了什么动作? 请教各位大侠一个问题! win32除了窗口函数,有没别的可以获取msg事件的函数? MFC在窗体中如何创建类似windows桌面图标的控件? GetModuleHandle 总是返回null(大家可能经常遇到) 字符集问题 (50分):常规dll(提供给delphi程序调用)中能定义一个mfc类的全局变量吗 提一个很蠢的问题 microsoft编译器如何使用Linux头文件? 中文路径从ANSI格式转换成UTF-8格式后,无法识别 暑假想打工挣钱的大学生和高手们请来看一看 有没有调试Service程序的简单方法?没有简单的,复杂一些的也行啊!!! 急得不得了!
哦,我是举个例子,明白我的意思就行了...vcmfc(菜虫):
我看到的绝大多数程序例子,现在都是这样转换啊...
long a=(long)b; 有可能个a付一个错值(不一定等于b)!如果int 是2BYTE,long 是4BYTE,那么a的值高2两个BYTE的值不定!
int b2=(int)a2;
确实是切割!b2的值等与a2的底两个BYTE!
明白了吗?
常量的这些我知道,但是
如果一个内存体比父类大的子类被切割成父类用,那会是什么结果?
如果一个内存体比子类小的父类被扩充成子类用,那会是什么结果?
"long a=(long)b; 有可能个a付一个错值(不一定等于b)!"----a的低位会等于b,高位会是0,这是编译器做的,你这句不对吧?
->那会只有父类的成员!
如果一个内存体比子类小的父类被扩充成子类用,那会是什么结果?
——>有可能程序出错!
----a的低位会等于b,高位会是0,这是编译器做的,你这句不对吧?
——>是的!我错了,把指针和数据类型搞混了!不好意思!呵呵!
如果一个内存体比父类大的子类被切割成父类用,那会是什么结果?
->那会只有父类的成员!
如果一个内存体比子类小的父类被扩充成子类用,那会是什么结果?
——>有可能程序出错!
这段
void somefuc(CWND* pWnd){...}
我们会常用CDialog/CView..的指针代入就是所谓的切割吧?为什么我们还能继续调用CDialg/CView的其他CWnd没有的成员函数?
如果是提升,就是说把pWnd扩充成了子类指针,为什么不会出错.
如果都不是提升或者扩充,编译器背后做了什么动作?
我们会常用CDialog/CView..的指针代入>就是所谓的切割吧?为什么我们还能继续调用CDialg/CView的其他CWnd没有的成员函数?
这不是切割,只是指针的强制类型转换,对保存有CDialog或者CView信息的内存体并没有改变。
>如果是提升,就是说把pWnd扩充成了子类指针,为什么不会出错.
这也不是提升,我们经常强制转换某个pWnd到pDialog或者pView,是因为这个pWnd指向的内存体本身其实是CDialog*或者CView*。如果都不是提升或者扩充,编译器背后做了什么动作?