| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 842 人关注过本帖
标题:从C++想到的数据结构
只看楼主 加入收藏
阿魔密火
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-11-3
收藏
 问题点数:0 回复次数:8 
从C++想到的数据结构
编程中常有类型转换,其内部的存储结构是怎么变化的?
如(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]
 (水平有限,请高人指正)
搜索更多相关主题的帖子: 数据结构 
2008-11-04 13:02
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
应该只截取低4位保存

学习需要安静。。海盗要重新来过。。
2008-11-04 13:11
阿魔密火
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-11-3
收藏
得分:0 
[bo][un]sunkaidong[/un] 在 2008-11-4 13:11 的发言:[/bo]

应该只截取低4位保存


是int型变为long型
从4位字宽8位字宽,是增长了。
2008-11-04 22:53
newyj
Rank: 2
等 级:新手上路
威 望:3
帖 子:542
专家分:0
注 册:2008-1-4
收藏
得分:0 
ls
为什么是int类型转换成long类型 ?
这个和 a+b的隐式转换 是不一样的 这个是把位数小的转换成位数大的
而 赋值 并不是这个样子的
2008-11-05 10:45
阿魔密火
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-11-3
收藏
得分:0 
[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]

请谢谢你的关注
2008-11-09 12:02
andyxmj
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-11-2
收藏
得分:0 
LS 我觉得你理解错了,本人也是初学者,赋值的时候是按“赋值表达式得类型由赋值表达式左值的类型决定,右值表达式要转换为左值表达式。”这样执行的,但是a本身没有变化
2008-11-09 12:24
newyj
Rank: 2
等 级:新手上路
威 望:3
帖 子:542
专家分:0
注 册:2008-1-4
收藏
得分:0 
赋值 是要 产生临时变量的 用这个临时变量 来转化 所以 右值是不会变化的
2008-11-09 12:53
shediao
Rank: 1
来 自:山东
等 级:新手上路
威 望:1
帖 子:52
专家分:0
注 册:2008-9-23
收藏
得分:0 
回复 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

希望这些可以给大家一点启示,
2008-11-09 22:39
lockhawk
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2008-9-17
收藏
得分:0 
#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型

人生最大痛苦:虽然不明白你们说什么,但还是要听!
2008-11-10 16:09
快速回复:从C++想到的数据结构
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019997 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved