免费注册 查看新帖 |

Chinaunix

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

关于32位,64位问题,求教! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-23 21:32 |只看该作者 |倒序浏览
32位机器C99编译环境下,int占4个字节,1个字节8bit,4*8=32位
64位机器我就不清楚了,哪位大虾能否给个列表,按照以下格式

          unsigned short | short | unsigned int | int | unsigned long | long | ...float...double
16位机器                                          2B
32位机器                                          4B
64位机器

最好能对编译环境做个说明,如32位机器上,TURBOC,int就只占2个字节,而C99占4个字节。另外通常的机器环境下,一个内存存储单元是8bit,有没有其他环境不是8位的。

有没有人做过big/little endian 高低位转换的,谢谢!!

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2007-02-23 21:36 |只看该作者
呵呵,我怎么就从来没有看到C99上规定int为4个字节呢?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2007-02-23 21:37 |只看该作者
在64位出来之前,int的长度一般为机器的字长,可是64位机器出来之后,一切都变了。

论坛徽章:
0
4 [报告]
发表于 2007-02-23 23:02 |只看该作者
一直做应用开发,基础知识太薄弱了,找到了,如下。

          ILP32 LP64 LLP64 ILP64  
char   8        8       8         8  
short 16      16     16       16  
int      32      32     32       64  
long   32      64     32       64  
long long  64  64  64  64  
指针  32  64  64  64  

对于big/little endian问题,可以通过移位和位运算实现,、
但是对于32位机器,移位超过32会有问题,对于64位机器生成的数据转32位,如果数据超过也会有问题

有兴趣来讨论一下。。

评分

参与人数 1可用积分 +2 收起 理由
langue + 2

查看全部评分

论坛徽章:
0
5 [报告]
发表于 2007-02-24 00:57 |只看该作者
原帖由 sishanji 于 2007-2-23 23:02 发表
一直做应用开发,基础知识太薄弱了,找到了,如下。

          ILP32 LP64 LLP64 ILP64  
char   8        8       8         8  
short 16      16     16       16  
int      32      32     32       6 ...



根据目标机器环境, 使用适当宏定义吧, 编写代码时候根据环境决定写不同的程序. 很多单独的64位程序.

评分

参与人数 1可用积分 +2 收起 理由
langue + 2

查看全部评分

论坛徽章:
0
6 [报告]
发表于 2007-02-24 15:58 |只看该作者
  1. #include <iostream>

  2. #define printTypeSize(x) std::cout << #x<<"      \t";printTypeBytes<x>();

  3. template <typename T>
  4. int printTypeBytes(){
  5.     std::cout<<sizeof(T)<< " bytes"<<std::endl;
  6.     return sizeof(T);
  7. }

  8. int main()
  9. {
  10.     printTypeSize(char);
  11.     printTypeSize(short);
  12.     printTypeSize(wchar_t);
  13.     printTypeSize(unsigned);
  14.     printTypeSize(int);
  15.     printTypeSize(float);
  16.     printTypeSize(size_t);
  17.     printTypeSize(long);
  18.     printTypeSize(double);
  19.     printTypeSize(long long);
  20.     //printTypeSize(void); /*Compile error*/
  21.     printTypeSize(void*);

  22.         return 0;
  23. }
复制代码


Ubuntu X86_64上的结果
char              1 bytes
short              2 bytes
wchar_t      4 bytes
unsigned      4 bytes
int                 4 bytes
float               4 bytes
size_t              8 bytes
long                8 bytes
double              8 bytes
long long     8 bytes
void*                8 bytes

论坛徽章:
0
7 [报告]
发表于 2007-02-24 16:18 |只看该作者
原帖由 sishanji 于 2007-2-23 23:02 发表
一直做应用开发,基础知识太薄弱了,找到了,如下。

          ILP32 LP64 LLP64 ILP64  
char   8        8       8         8  
short 16      16     16       16  
int      32      32     32       6 ...

I代表int,L代表long,P代表pointer,我只在Solaris操作系统的源代码里见过这几个宏定义,其他OS里没见过

论坛徽章:
0
8 [报告]
发表于 2007-02-28 00:42 |只看该作者
64位早就有了,不是到今天才应用吧!

论坛徽章:
0
9 [报告]
发表于 2007-02-28 02:25 |只看该作者
原帖由 sishanji 于 2007-2-23 23:02 发表
一直做应用开发,基础知识太薄弱了,找到了,如下。

          ILP32 LP64 LLP64 ILP64  
char   8        8       8         8  
short 16      16     16       16  
int      32      32     32       6 ...

我见过的64位机上int都是4字节,我还以为所有机器都这样呢,今天才知道错了

论坛徽章:
0
10 [报告]
发表于 2007-02-28 08:42 |只看该作者
原帖由 galaxywar 于 2007-2-28 02:25 发表

我见过的64位机上int都是4字节,我还以为所有机器都这样呢,今天才知道错了


你见到的是LP64, 不是 ILP64,int依然是4字节

模式:
ILP32
LP64
LLP64
ILP64  

I = INT
L = LONG
P = POINTER
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP