免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5226 | 回复: 14
打印 上一主题 下一主题

[C++] [10分求程序]实现一个Integer类,总是4字节大小 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-10 17:58 |只看该作者 |倒序浏览
10可用积分
如题,求一个c++类的实现代码(或者方法/思路),就像Java的int和Integer那样,无论哪个平台上面云运行,16/32/64位的平台上面,这个c++的Integer类都是存储一个4字节的整形数,而且能够调整endian的表示方式。

希望能看到一个简洁明确的实现,谢谢啦!!!

最佳答案

查看完整内容

没有特别好的办法,用条件编译的方法会导致程序难以理解和修改。可以考虑自动代码生成,这也是现在最流行的方法可以这样:写一个命令或者脚本,例如就叫mycmd,在32位系统下输出32,在64位系统下输出64, 16位系统输出16>mycmd32然后写一个autogen脚本,来生成一个头文件mytype.h#!/bin/sh#autogenrm -fr mytype.hBITS=`mycmd`if [ $BITS = "32 ]then cat mytype.htypedef int int32;typedef long int64;!elif [ $BITS = "16" ]then ...

论坛徽章:
0
2 [报告]
发表于 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的运行就可以了。

论坛徽章:
0
3 [报告]
发表于 2008-12-10 18:15 |只看该作者
需要支持哪些操作?以前写了个,但不高效,如果要高效的还是用别人的库吧

论坛徽章:
0
4 [报告]
发表于 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这样的编译选项。

谢谢啦!

论坛徽章:
0
5 [报告]
发表于 2008-12-10 18:35 |只看该作者

回复 #3 jeanlove 的帖子

我前面理解偏了,你要的Integer只存放一个4字节大小的整数?我开始以为你要一个存放4的整数倍大小的大数类
你的需求不需要类吧?只需要用条件编译为各个平台上的4字节整形类型定义一个类型别名Intger即右?

论坛徽章:
0
6 [报告]
发表于 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 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-12-10 19:04 |只看该作者

回复 #5 jeanlove 的帖子

如果用类实现,你的to_4byteint()在不同的平台接口有所不同(返回类型)?这还得用条件编译
类内部实现还得用条件编译(根据不平编译器平台先用不同的底层类型)
我觉得没必须实现为类,用类型别名,再加一个二进位翻转的函数就可以了

论坛徽章:
0
8 [报告]
发表于 2008-12-10 21:31 |只看该作者
原帖由 tyc611 于 2008-12-10 19:04 发表
如果用类实现,你的to_4byteint()在不同的平台接口有所不同(返回类型)?这还得用条件编译
类内部实现还得用条件编译(根据不平编译器平台先用不同的底层类型)
我觉得没必须实现为类,用类型别名,再加一个 ...

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

谢谢!

论坛徽章:
0
9 [报告]
发表于 2008-12-10 22:04 |只看该作者

回复 #7 jeanlove 的帖子

在32位和64位平台上,一般int都是32位,在16位平台上用long
有些编译器还提供指定宽度的类型,比如VC里的__int32就肯定是32位
根据你支持的目标平台写就行了

论坛徽章:
0
10 [报告]
发表于 2008-12-11 10:02 |只看该作者
原帖由 tyc611 于 2008-12-10 22:04 发表
在32位和64位平台上,一般int都是32位,在16位平台上用long
有些编译器还提供指定宽度的类型,比如VC里的__int32就肯定是32位
根据你支持的目标平台写就行了

可是我在*nix环境下呀,没有__int32这样的数据类型。我怎么定义它?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP