32位与64位下各类型长度对比
来源:互联网 发布:艾瑞数据网站排名 编辑:程序博客网 时间:2024/05/16 14:00
和编译器有关系
编译器一般会做这些设定:
char占一个机器字节byte,一般是8位,但也出现过6位,7位,9位,12位和16位。
int占一个机器字word,一般是32位。但也出现过8, 9, 12, 18, 24, 36, 39, 40, 48和60位。
long占一个通用寄存器,所以32位机上是32位,64位机上是64位。
指针和long一样大。
float如果是按照IEEE的标准是32位。
double如果是按照IEEE的标准是64位。
64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂);可以访问大型数据库。本文介绍的是64位下C语言开发程序注意事项。
1. 32 位和 64 位C数据类型
32和64位C语言内置数据类型,如下表所示:
上表中第一行的大写字母和数字含义如下所示:
I表示:int类型
L表示:long类型
P表示:pointer指针类型
32表示:32位系统
64表示64位系统
如:LP64表示,在64位系统下的long类型和pointer类型长度为64位。
64位Linux 使用了 LP64 标准,即:long类型和pointer类型长度为64位,其他类型的长度和32位系统下相同类型的长度相同,32位和64位下类型的长度比较见上图的蓝色部分。
下图为在32和64位linux系统下使用sizeof检测出的数据类型的长度。
32位平台下结果:
64位平台下结果:
2. 64系统下开发注意事项:
2.1 格式化字符串:long使用%ld,指针使用%p,例如:
- char *ptr = &something;
- printf (%x\n", ptr);
上面的代码在 64 位系统上不正确,只显示低 4 字节的内容。正确的方法是:使用 %p,如下:
- char *ptr = &something;
- printf (%p\n", ptr);
2.2 数字常量:常量要加L
例1,常数 0xFFFFFFFF 是一个有符号的 long 类型。在 32 位系统上,这会将所有位都置位(每位全为 1),但是在 64 位系统上,只有低 32 位被置位了,结果是这个值是 0x00000000FFFFFFFF。
例2,在下面的代码中,a 的最大值可以是 31。这是因为 1 << a 是 int 类型的。
- long l = 1 << a;
- long l = 1L << a;
- int i = -2;
- unsigned int j = 1;
- long l = i + j;
- printf("Answer: %ld\n",l);
2.4 转换截断:
转换截断发生在把long转换成int时,如下例:
- int length = (int) strlen(str);
2.5 赋值:
不要交换使用 int 和 long 类型,例如:
- int i;
- time_t l;
- i = l;
不要使用 int 类型来存储指针,例如:
- unsigned int i, *ptr;
- i = (unsigned) ptr;
不要使用指针来存放 int 类型的值。例如:
- int *ptr;
- int i;
- ptr = (int *) i;
2.6 移植倒64位环境下的性能:
移植到64位平台后,性能实际上降低了。原因是64位中的指针长度和数据大小有关,并由此引发的缓存命中率降低、数据对齐等问题。通过改变结构中数据排列的先后顺序,会因为少了填充数据,存储空间也随之减少。如:
2.7 程序中链接到的库要使用64位的库。
由上可见所有的问题都是由long和指针长度改变引起,在开发过程中只有牢记long和指针类型的长度。
转自:http://blog.sina.com.cn/s/blog_57421ff80100c7g1.html
- 32位与64位下各类型长度对比
- 32位与64位下各类型长度对比
- 32位与64位下各类型长度对比
- 32位与64位下各类型长度对比
- 32位与64位下各类型长度对比
- 32位与64位下各类型长度对比
- 32位与64位下各类型长度对比
- 32位与64位下各类型长度对比
- 32位与64位Linux系统下各类型长度对比
- 【C/C++开发】【VS开发】win32位与x64位下各类型长度对比
- 16位,32位,64位操作系统下,各类型的长度整理
- linux下32位机与64位机基本数据类型长度对比
- linux下32位机与64位机基本数据类型长度对比[zt]
- linux下32位机与64位机基本数据类型长度对比
- linux下32位机与64位机基本数据类型长度对比
- linux下32位机与64位机基本数据类型长度对比
- linux下32位机与64位机基本数据类型长度对比
- 32位与64位机器下各数据类型长度对比
- Nagle算法与TCP_NODELAY和TCP_CORK
- X64上恢复VS关键字__asm的使用
- C#获取当前日期时间
- ios之应用数据存储二:NSKeyedArchiver类
- NYOJ 663 弟弟的作业
- 32位与64位下各类型长度对比
- 第五章里KeyFile保护的实例的不解
- 下载网络文件HttpURLConnection.getContentLength()大小为 0
- n 的阶乘 C 语言版(大数)
- 关于 JavaScript 的36道题 [ JavaScript Puzzlers! ]
- 其实,不用逼迫,人们也想结婚
- preg_match_all
- 怎么查看自己匿名在百度知道提问的问题?
- KMP小结