Chinaunix

标题: [10分求程序]实现一个Integer类,总是4字节大小 [打印本页]

作者: jeanlove    时间: 2008-12-10 17:58
标题: [10分求程序]实现一个Integer类,总是4字节大小
如题,求一个c++类的实现代码(或者方法/思路),就像Java的int和Integer那样,无论哪个平台上面云运行,16/32/64位的平台上面,这个c++的Integer类都是存储一个4字节的整形数,而且能够调整endian的表示方式。

希望能看到一个简洁明确的实现,谢谢啦!!!
作者: cling6394    时间: 2008-12-10 17:58
原帖由 jeanlove 于 2008-12-11 10:02 发表

可是我在*nix环境下呀,没有__int32这样的数据类型。我怎么定义它?

没有特别好的办法,用条件编译的方法会导致程序难以理解和修改。可以考虑自动代码生成,这也是现在最流行的方法
可以这样:
写一个命令或者脚本,例如就叫mycmd,在32位系统下输出32,在64位系统下输出64, 16位系统输出16
>mycmd
32

然后写一个autogen脚本,来生成一个头文件mytype.h
#!/bin/sh
#autogen
rm -fr mytype.h
BITS=`mycmd`
if [ $BITS = "32 ]
then
  cat <<! > mytype.h
typedef int int32;
typedef long long int64;
!
elif [ $BITS = "64" ]
then
  cat <<! >mytype.h
typedef int int32;
typedef long int64;
!
elif [ $BITS = "16" ]
then
  cat <<! >mytype.h
typedef long int32;
typedef long long int64;
!
fi
... ...
然后让程序代码去包含mytype.h,就可以了。
编译之前的./configure步骤保证包含autogen的运行就可以了。
作者: tyc611    时间: 2008-12-10 18:15
需要支持哪些操作?以前写了个,但不高效,如果要高效的还是用别人的库吧
作者: jeanlove    时间: 2008-12-10 18:28
原帖由 tyc611 于 2008-12-10 18:15 发表
需要支持哪些操作?以前写了个,但不高效,如果要高效的还是用别人的库吧

有这样的库么? 能否介绍1-2个(不要太庞大的,像ACE那种的,东西太多,累死了).
只需要保证存储4字节的整数,保证能在16位平台就转换为long类型,在64位平台就转换为4字节的int类型
Integer I;
long l=(long)I;//16位平台代码
int i=(int)i;//64位平台代码
就行了,重载操作符的方法我知道,但是在代码里面怎么区分平台呢? 有没有pragma之类的命令选项能实现这一功能? 我不想通过在代码里面定义一堆宏然后在编译选项里面根据平台信息去确定用D_16bit D_32bit这样的编译选项。

谢谢啦!
作者: tyc611    时间: 2008-12-10 18:35
标题: 回复 #3 jeanlove 的帖子
我前面理解偏了,你要的Integer只存放一个4字节大小的整数?我开始以为你要一个存放4的整数倍大小的大数类
你的需求不需要类吧?只需要用条件编译为各个平台上的4字节整形类型定义一个类型别名Intger即右?
作者: jeanlove    时间: 2008-12-10 18:44
原帖由 tyc611 于 2008-12-10 18:35 发表
我前面理解偏了,你要的Integer只存放一个4字节大小的整数?我开始以为你要一个存放4的整数倍大小的大数类
你的需求不需要类吧?只需要用条件编译为各个平台上的4字节整形类型定义一个类型别名Intger即右?


用条件编译可以.这样最简单。

或者用类Integer实现,构造函数用省略号,能满足以下条件的就行了:
1.  总是存储4字节大小
2.  能调整存储的endian方式,是低位在前还是高位在前 set_big_endian(bool big_endian=true)
3.  能通过重载运算符或者函数调用to_4byteint()返回一个4字节的整数,在16位平台返回long,在32/64位平台返回int

谢谢!

[ 本帖最后由 jeanlove 于 2008-12-10 18:46 编辑 ]
作者: tyc611    时间: 2008-12-10 19:04
标题: 回复 #5 jeanlove 的帖子
如果用类实现,你的to_4byteint()在不同的平台接口有所不同(返回类型)?这还得用条件编译
类内部实现还得用条件编译(根据不平编译器平台先用不同的底层类型)
我觉得没必须实现为类,用类型别名,再加一个二进位翻转的函数就可以了
作者: jeanlove    时间: 2008-12-10 21:31
原帖由 tyc611 于 2008-12-10 19:04 发表
如果用类实现,你的to_4byteint()在不同的平台接口有所不同(返回类型)?这还得用条件编译
类内部实现还得用条件编译(根据不平编译器平台先用不同的底层类型)
我觉得没必须实现为类,用类型别名,再加一个 ...

dx能具体写一下么? 条件编译#ifdef能判断平台的位数?

谢谢!
作者: tyc611    时间: 2008-12-10 22:04
标题: 回复 #7 jeanlove 的帖子
在32位和64位平台上,一般int都是32位,在16位平台上用long
有些编译器还提供指定宽度的类型,比如VC里的__int32就肯定是32位
根据你支持的目标平台写就行了
作者: jeanlove    时间: 2008-12-11 10:02
原帖由 tyc611 于 2008-12-10 22:04 发表
在32位和64位平台上,一般int都是32位,在16位平台上用long
有些编译器还提供指定宽度的类型,比如VC里的__int32就肯定是32位
根据你支持的目标平台写就行了

可是我在*nix环境下呀,没有__int32这样的数据类型。我怎么定义它?
作者: jeanlove    时间: 2008-12-11 10:43
原帖由 cling6394 于 2008-12-11 10:39 发表

没有特别好的办法,用条件编译的方法会导致程序难以理解和修改。可以考虑自动代码生成,这也是现在最流行的方法
可以这样:
写一个命令或者脚本,例如就叫mycmd,在32位系统下输出32,在64位系统下输出64, 1 ...

谢谢,这个很强大很好用!!!
作者: 5毛党党员    时间: 2008-12-11 10:49
原帖由 cling6394 于 2008-12-10 17:58 发表

没有特别好的办法,用条件编译的方法会导致程序难以理解和修改。可以考虑自动代码生成,这也是现在最流行的方法
可以这样:
写一个命令或者脚本,例如就叫mycmd,在32位系统下输出32,在64位系统下输出64, 1 ...

很强大的方法~~~~,以后也尝试一下脚本生成头文件的方法
作者: yulc    时间: 2008-12-11 11:01
没太理解,为什么不这样呢?

class Int32
{
private:
    char _data[4];

public:
    构造,析构等等方法...

};


这样,我类的大小就肯定是 4字节,这_data用来存储就可以.
作者: jeanlove    时间: 2008-12-11 11:12
原帖由 yulc 于 2008-12-11 11:01 发表
没太理解,为什么不这样呢?

class Int32
{
private:
    char _data[4];

public:
    构造,析构等等方法...

};


这样,我类的大小就肯定是 4字节,这_data用来存储就可以.

实现出来会不会很低效呢... ...每次int的操作充满了函数的调用,字节的拷贝... ...
作者: net_robber    时间: 2008-12-11 11:22
typedef Integer int32;




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2