32位和64位下数据大小

32位下和64位下数据大小的不同
 
 
 
最近在Linux下移植程序时遇到了一个问题,将32位机下的程序移植到64位上,在用long型读入文件时发生了错误,读出来的是0,后经测试原来是在32位机下和64机下某些数据类型表示的不一样。测试程序如下:
 

#include <stdio.h>

int main ()
{
  printf ("char /n", sizeof(char));
  printf ("short /n", sizeof(short));
  printf ("int /n", sizeof(int));
  printf ("long /n", sizeof(long));
  printf ("long long/n", sizeof(long long));
  printf ("float /n", sizeof(float));
  printf ("double /n", sizeof(double));
  printf ("long double /n", sizeof(long double));
  printf ("pointer /n", sizeof(void*));

  return 0;
}

 
在Windows下,是这样的结果

WinXP       32 x64
char        1   1
short       2   2
int         4   4
long        4   4
long long   8   8
float       4   4
double      8   8
long double 8   8
pointer     4   8

而在Linux下面,却是另一个结果
Linux      x86 amd64
char        1   1
short       2   2
int         4   4
long        4   8
long long   8   8
float       4   4
double      8   8
long double 12  16
pointer     4   8
由此可见,在移植程序时,要特别注意long,long double和pointer指针类型的使用。
 
数据在内存中存储的方法也不一样:

Little-endian 是将低位字节存储在内存的低地址中,将高位字节存储在内存的高地址中。

Big-endian 是将高位字节存储在内存的低地址中,将低位字节存储在内存的高地址中。

  3. 64 long int 类型的布局

 

低地址

 

 

 

 

 

 

高地址

Little endian

Byte 0

Byte 1

Byte 2

Byte 3

Byte 4

Byte 5

Byte 6

Byte 7

Big endian

Byte 7

Byte 6

Byte 5

Byte 4

Byte 3

Byte 2

Byte 1

Byte 0

 

例如,32 位的字 0x12345678 在 big endian 机器上的布局如下:


4. 0x12345678 big-endian 系统上的布局

内存偏移量

0

1

2

3

内存内容

0x12

0x34

0x56

0x78

 

如果将 0x12345678 当作两个半字来看待,分别是 0x1234 和 0x5678,那么就会看到在 big endian 机器上是下面的情况:


5. 0x12345678 big-endian 系统上当作两个半字来看待的情况

内存偏移量

0

2

内存内容

0x1234

0x5678

 

然而,在 little endian 机器上,字 0x12345678 的布局如下所示:


6. 0x12345678 little-endian 系统上的布局

内存偏移量

0

1

2

3

内存内容

0x78

0x56

0x34

0x12

 

类似地,两个半字 0x1234 和 0x5678 如下所示:


7. 0x12345678 little-endian 系统上作为两个半字看到的情况(对此表示怀疑,要实验一下

内存偏移量

0

2

内存内容

0x3412

0x7856

 

 

从 32 位迁移到 64 位时,增长的主要类型是指针和派生数据类型,如句柄。在 Windows 64 位中,目前的指针和派生类型64位  long 类型。大小增加的其他一些类型还有:WPARAM、LPARAM、LRESULT 和 SIZE_T。其中一个原因是,它们作为参数使用,并且某些函数将指针作为参数使用

从“int”和“long”派生出的所有类型的大小仍然是 32 位,其中包括 DWORD、UINT 和 ULONG。小于 32 位的类型保留它们当前的大小。一个示例就是“short”数据类型,它仍然保留为 16 位的带符号整数。



注意这里已经明显指出了句柄的大小是64位
看来 开始进行 64 位 Windows 系统编程之前需要了解的所有信息 所描述的句柄仍然是32位的说法是完全错误的.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值