注册 登录
编程论坛 C++教室

从C++想到的数据结构

阿魔密火 发布于 2008-11-04 13:02, 844 次点击
编程中常有类型转换,其内部的存储结构是怎么变化的?
如(int型变为long型)字宽从4变为8,系统内部是如何分配存储空间的?
列举如下例子
#include <iostream>
using namespace std;
int main()
{
  int a=4
  long b=4
  a=b
  return 0
 }
系统内部先给a分配四个字宽的存储空间,一个确定的存储地址,
之后又给b分配一个八个字宽的存储空间,一个确定的存储地址,
之后将b赋给a,此时a自动转换成long,
[bo]请问,此时a的存储地址,存储空间会是怎样的变化?[/bo]
 (水平有限,请高人指正)
8 回复
#2
sunkaidong2008-11-04 13:11
应该只截取低4位保存
#3
阿魔密火2008-11-04 22:53
[bo][un]sunkaidong[/un] 在 2008-11-4 13:11 的发言:[/bo]

应该只截取低4位保存


是int型变为long型
从4位字宽8位字宽,是增长了。
#4
newyj2008-11-05 10:45
ls
为什么是int类型转换成long类型 ?
这个和 a+b的隐式转换 是不一样的 这个是把位数小的转换成位数大的
而 赋值 并不是这个样子的
#5
阿魔密火2008-11-09 12:02
[bo][un]newyj[/un] 在 2008-11-5 10:45 的发言:[/bo]

ls
为什么是int类型转换成long类型 ?
这个和 a+b的隐式转换 是不一样的 这个是把位数小的转换成位数大的
而 赋值 并不是这个样子的


我也发现了点错误
帖子改下
[bo]赋值表达式类型变化的问题
#include<iostream>
using namespace std;
int main()
#include<iostream>
using namespace std;
{
    int a=3,length;
    double b=3;
    length=sizeof(a);
    cout<<"变化前a的存储大小是:"<<length<<endl;
    b=a;
    length=sizeof(a);
    cout<<"变化后a的存储大小是:"<<length<<endl;
    system("pause");
}

vc2005调试输出结果
变化前a的存储大小是:4
变化后a的存储大小是:4
个人认为,变化后的存储大小是8.参考人邮版C++第34页“[un]赋值表达式得类型由赋值表达式左值的类型决定,右值表达式要转换为左值表达式[/un]。”当b=a时a的类型由int变为double,所以我认为变化后a的存储大小是8[/bo]

请谢谢你的关注
#6
andyxmj2008-11-09 12:24
LS 我觉得你理解错了,本人也是初学者,赋值的时候是按“赋值表达式得类型由赋值表达式左值的类型决定,右值表达式要转换为左值表达式。”这样执行的,但是a本身没有变化
#7
newyj2008-11-09 12:53
赋值 是要 产生临时变量的 用这个临时变量 来转化 所以 右值是不会变化的
#8
shediao2008-11-09 22:39
回复 5# 的帖子
兄弟你说的好像有点出入吧? 右值怎么会改变呢? 你还是把你的那本书仔细看看吧。

不知道你是否在 win32下 调试过 win32下long和int是一样的都宽度为4;这里我就用 int 和 short 说明一下:

#include "stdafx.h"
#include <iostream.h>
#include<limits.h>
#include<math.h>
int main(int argc, char* argv[])
{
    cout<<"IntSize="<<sizeof(int)<<"  IntMax="<<INT_MAX<<"  IntMin="<<INT_MIN<<endl;
    cout<<"LongSize="<<sizeof(long)<<"  LongMax="<<LONG_MAX<<"  LongMIn="<<LONG_MIN<<endl;
    cout<<"shortSize="<<sizeof(short)<<"  shortMax="<<SHRT_MAX<<"  ShortMIn="<<SHRT_MIN<<endl;
    int a=131072;// 2的17次方为131072
    cout<<"a的地址:"<<&a<<"  a的空间大小"<<sizeof(a)<<endl;
    short b=(short)a;
    cout<<"b="<<b<<endl;//若b为0的话就代表着结尾的低位取8位,b=1的话就表示高位取
    cout<<"a的地址:"<<&a<<"  a的空间大小"<<sizeof(a)<<endl;
    return 0;
}

显示结果:
IntSize=4  IntMax=2147483647  IntMin=-2147483648
LongSize=4  LongMax=2147483647  LongMIn=-2147483648
shortSize=2  shortMax=32767  ShortMIn=-32768
a的地址:0x0012FF7C  a的空间大小4
b=0
a的地址:0x0012FF7C  a的空间大小4
Press any key to continue

从上例可以看出 左值和右值是没有必然联系的,只不过是把右边的值 经过类型转化后付给左边,等式右边是根本不会改变的。要说类型转化就不应该使用 这么简单的例子说明,我这里写一个程序 可以给大家参考参考一下 在c++中很有代表性:

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream.h>

class A{
private:
    int a;
public:
    A(int x):a(x){}
    void show(){
        cout<<"A::a="<<a<<endl;
    }
};
class B{
private:
    int b;
public:
    B(int y):b(y){}
    void show(){
        cout<<"B::b="<<b<<endl;
    }
};
class C:public A,public B{
private:
    int c;
public:
    C(int x,int y,int z):A(x),B(y),c(z){}
    void show(){
        A::show();
        B::show();
        cout<<"C::c="<<c<<endl;
    }
};
int main(int argc, char* argv[])
{
    C c(1,2,3);
    cout<<" ======c初始化后========"<<endl;
    c.show();
    A a=c;
    cout<<"-----c进行类型转化后付给a---"<<endl;
    a.show();
    B b=c;
    cout<<"-----c进行类型转化后付给b---"<<endl;
    b.show();
    cout<<"我们来看看a,b,c三个类的地址:"<<endl;
    cout<<"a:"<<&a<<endl;
    cout<<"b:"<<&b<<endl;
    cout<<"c:"<<&c<<endl;//地址不一样说明什么?自己想想
    return 0;
}

程序的结果:
 ======c初始化后========
A::a=1
B::b=2
C::c=3
-----c进行类型转化后付给a---
A::a=1
-----c进行类型转化后付给b---
B::b=2
我们来看看a,b,c三个类的地址:
a:0x0012FF70
b:0x0012FF6C
c:0x0012FF74
Press any key to continue

希望这些可以给大家一点启示,
#9
lockhawk2008-11-10 16:09
#include <iostream.h>
int main()
{
  int a=4;
  double b=4;
  a=b;
  cout<<&a<<endl;
  cout<<&a+1<<endl;
  return 0;
}
输出的两个地址相差4个字节,可以证明a是int型
1