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位的说法是完全错误的.

32位和64位下数据大小相关推荐

  1. 32位和64位编译器下的常见类型大小

    写在前面 我们常常听别人说到32位操作系统,64位操作系统,(个人理解)实质上这里所说的32和64指的是地址长度位数. 如果说你是32位的操作系统,那么寻址空间就有2^32,即4G空间大小: 如果说你 ...

  2. c语言的程序是32位还是64位,在C语言中,对于32位计算机和64位计算机,long的大小是多少?...

    本问题已经有最佳答案,请猛点这里访问. 对于32位平台,C中的long的大小为4字节,而对于64位平台,为8字节是否正确? 通常,但不一定. 如果要使用固定大小的类型,请使用int32_t或int64 ...

  3. 64 大小_电脑系统32位和64位有什么区别

    众所周知,windows系统有32位和64位,但这两者有什么不同呢?什么样的电脑装什么版本的呢?笔者就简单的来讲一下两者的区别. 一.支持的内存不同 32位的操作系统,最多支持4G的内存,实际内存为3 ...

  4. 32位和64位机器上C语言数据类型的大小

    作为嵌入式开发的人员,是必须了解C语言在不同位数机器上占用的字节大小的,下面做下对比 不同位数平台对比: \ 16位平台 32位平台 64位平台 char 1个字节8位 1个字节8位 1个字节 sho ...

  5. 64位mysql 和32位区别_navicat for mysql 64位和32位区别,win7 64位下用32位和64位有区别吗??...

    展开全部 一.win7 32位和64位的区别 先说说硬件配置上的区别.选择64位Windows 7的网友中很有大比例是内存大于或等于4GB.在62616964757a686964616fe58685e ...

  6. Java--位、字节、字符、字符编码、数据存储单位 电脑的32位和64位的区别是什么呢

    引言: 这里放一张Java语言数据类型帮助理解 1. 位(bit) 位(bit):是计算机 内部数据 储存的最小单位,11001100是一个八位二进制数. 2. 字节(byte) 是计算机中 数据处理 ...

  7. apache tomcat下32还是64_Windows操作系统从win7升级到win 10,该选择32位还是64位?

    #我要上头条##科技快讯##科技萌新成长营#自Win7时代开始,微软的系统便被划分为了64位和32位两种不同版本,随着2020年初微软官方发出Windows7停服公告,越来越多的用户开始往Wdows1 ...

  8. linux环境下shellcode的编写:32位和64位

    linux环境下shellcode的编写 shellcode的理解 使用pwntools工具编写 自己实现更精炼的 32位shellcode 64位shellcode shellcode的理解   我 ...

  9. 【笔试题】C语言结构体中,不同的数据类型在32位和64位下所占字节的区别

    题目 如下C程序,在64位处理器上运行后sz的值是什么? struct st {int *p;int i;char a; }; int sz=sizeof(struct st); 答案 16 解析 考 ...

最新文章

  1. “美登杯”上海市高校大学生程序设计邀请赛 **D. 小花梨的取石子游戏**
  2. Netty Java快速指南
  3. JDK 8时代的抽象类与接口
  4. 2018年终总结—努力做一个有趣的人
  5. iOS开源App整理
  6. linux 下 packet_mmap 前篇 (抓包实现)
  7. My97DatePicker时间控件在asp.net的应用
  8. 众昂矿业助力萤石氟化工产业链破竹般发展
  9. mysql 签到_签到功能,用mysql还是redis?
  10. hald进程 linux,centos hald 进程详解
  11. 《奇点来临》——镜子测试与认知
  12. 【机器学习11】LAD,K-means,SVM分析鸢尾花和月亮数据集
  13. XMLHttpRequest和referer
  14. Chapter_one
  15. 毕业设计—图书馆预约系统
  16. Guava Futures异步回调机制源码解析
  17. java 电子发票_java电子发票管理系统-Go语言中文社区
  18. crypto++(cryptopp)加密库aes算法的使用
  19. html如何加入多张图片自动滚动,微技巧丨滑动样式如何添加多张图片
  20. irq domain 分析 GICV3

热门文章

  1. JS 判断一个字符串中每个字母出现的次数
  2. 【190112】VC++ 小型会员积分管理系统源代码
  3. 【概念】为什么区块链被称为分布式数据库?举例讲解分布式数据库包会教程。区块链分布式数据库到底是什么?什么是分布式数据库?一千六百字讲清楚什么事分布式数据库。
  4. 数据分析实例一:Python批量处理excel文件
  5. Cookie的常用方法、删除Cookie的方式
  6. 什么是H5及H5页面作用
  7. 如何通过实验室离心机深入了解细胞
  8. 微信校园浴室预约小程序系统毕业设计毕设(6)开题答辩PPT
  9. 10.0 SpringMVC源码分析之MVC 模型由来
  10. 用Python生成抖音字符视频!