C编程注意32位机器和64位机器的差别及unsigned和signed
C编程注意32位机器和64位机器的差别及unsigned和signed
1.64bit CPU拥有更⼤的寻址能⼒,最⼤⽀持到16GB内存,⽽32bit只⽀持4G内存
2.64位CPU⼀次可提取64位数据,⽐32位提⾼了⼀倍,理论上性能会提升1倍。但这是建⽴在64bit操作系统,64bit软件的基础上的。
C/C++ 32位机器和64位机器差异问题总结跨平台移植问题语⾔编程需要注意的64位和32机器的区
#include < stddef.h>
OS version:Red Hat Enterprise Linux Server release 5.3 (Tikanga) linux 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 size_t本⾝⼀个作⽤就是避免考虑64还是32。64位下Long和指针是64位的
size_tm_unNo;
sprintf(path,"%u",m_unNo); //这句在32位机器上正常64位机器上会编译警告:“警告:格式 ‘%u’ 需要类型 ‘unsigned int’,但实参4的类型为 ‘size_t’”
%u 对应 unsigned int在64位机器上还是32位,⽽size_t已经变成64位了。
char* 指针在64位下是64位
m_pMem = new char[nSize];
int off = (int)m_pMem%nAlign; //在32位编译正常,在64位机器上编译报错:“ 错误:从 ‘char*’ 到 ‘int’ 的转换损失精度”
改为就可以达到兼容效果了int off = (uint64_t)m_pMem%nAlign; //因为int在64位下仍为32位,char×已经变位64位了。
⼀、数据类型特别是int相关的类型在不同位数机器的平台下长度不同。C99标准并不规定具体数据类型的长度
⼤⼩,只规定级别。作下⽐较:
16位平台
char 1个字节8位
short 2个字节16位
int 2个字节16位
long 4个字节32位
指针 2个字节
32位平台
char 1个字节8位
short 2个字节16位
int 4个字节32位
long 4个字节
long long 8个字节
指针 4个字节
64位平台
char 1个字节
short 2个字节
int 4个字节
long 8个字节(区别)
long long 8个字节
指针 8个字节(区别)
⼆、编程注意事项
为了保证平台的通⽤性,程序中尽量不要使⽤long数据库型。可以使⽤固定⼤⼩的数据类型宏定义:
typedef signed char      int8_t
typedef short int            int16_t;
typedef int                      int32_t;
# if __WORDSIZE == 64卫生知识
教师证怎么考
typedef long int              int64_t;
# else
__extension__
typedef long long int      int64_t;
#endif
三、使⽤int时也可以使⽤intptr_t来保证平台的通⽤性,它在不同的平台上编译时长度不同,但都是标准的平台长度,⽐如64位机器它的长度就是8字节,32位机器它的长度是4字节,定义如下:
#if __WORDSIZE == 64
typedef long int                intptr_t;
#else
typedef int                        intptr_t;
#endif
编程中要尽量使⽤sizeof来计算数据类型的⼤⼩
以上类型定义都有相应的⽆符号类型。
另外还有ssize_t和size_t分别是unsigned和signed size of computer word size。它们也是表⽰计算机的字长,在32位机器上是int型,在64位机器上long型,从某种意义上来说它们等同于intptr_t和uintptr_t。它们在stddef.h⾥⾯定义。需要注意的是socket的accept函数在有些操作系统上使⽤size_t是不正确的,因为accept接收的int*类型,⽽size_t可能是long int 类型。后来BSD使⽤sock_t来替代它。
⼀、C
1.⼏条规则
(1)char类型⼀般是8bit,但ANSI C⾥没有硬性规定其长度,某些嵌⼊式编译器可能是16bit
(2)short和long类型的长度不相同
(3)int类型通常同具体机器的物理字长相同
(4)short通常是16bits, int通常是16bits or 32bits每种编译器可以根据硬件的不同⾃由确定, 但是short和int必须最少是16bits, ⽽long 类型必须最少是32bits, 并且short必须⽐int和long类型要短。
2.32位机上类型长度
size of char: 1
size of int: 4
size of long:4
size of float:4
size of long long:8
size of double:8
size of long double:12
size of char * :4
3.64位机上类型长度
size of char:1
size of int:4
size of long :8
size of float :4
size of long long:8
中秋短语size of double:8
size of long double:16
size of char * :8
4.16位机类型长度
char: 1
int: 2
long:4
unsigned int:2
unsigned short:2
unsigned long:4
float:4
size of char * :4
⼆、C++
1.字节和字长
字节,⼋位就是⼀个字节,是固定概念。字长是指计算机⼀次能处理的⼆进制数据的长度,是⼀个⾮固定的概念。例如,8位计算机的字长为8,即⼀个字节, 32位计算机的字长位32,即4个字节,同理,64位计算机的字长为64,即8字节。
2.char类型始终是⼀个字节长,即8位。
3.int、short int和long int
通常int为⼀个字长,short为半个字长,long为⼀个或2个字长(在32位机器中为⼀个字长)。
4.浮点型float、双精度double、和长双精度long double
典型情况下,float 为⼀个字,double是两个字,long double为三个或四个字。
32位机指针为什么是4个字节 64位与32位机的区别
int类型⽐较特殊,具体的字节数同机器字长和编译器有关。如果要保证移植性,尽量⽤__int16 __int32 __int64吧,或者⾃⼰typedef int INT32⼀下。C、C++标准中只规定了某种类型的最⼩字节数(防⽌溢出)。
通常的64位技术是相对32位⽽⾔的,这个位数指的是CPU GPRs(General-Purpose register通⽤寄存器)的数据宽度为64位,⽽32位的处理器的通⽤寄存器的数据宽度为32位,64位指令集就是运⾏64位数据的指令,也就是说⼀次可以运⾏64bit的数据。
通⽤寄存器:可⽤于传送和暂存数据,也可以参与算术逻辑运算,并保存运算结果。通⽤寄存器的长度取决于机器字长。
字长:字长是CPU的主要技术指标之⼀,指的是CPU⼀次能并⾏处理的⼆进制的位数,字长是8的整倍数,通常的PC机的字长为16位,32位,64位。⼀台16位字长的PC机可以直接处理2^16(65536)之内的数字,对于超过此范围的数字需要分解的⽅法来处理。32位机⽐16位机优越的原因之⼀就在于它在⼀次操作中能处理的数字⼤,32位机字长的PC机能直接处理的数字为2^32(40亿),能处理的数字越⼤,则操作的次数就越少,从⽽系统的效率就越⾼。
字长与寻址空间:处理器字长是指处理机能同时处理的位数,处理器的字长越⼤,则说明它的运算能⼒越强。
处理的寻址范围:要看处理器的地址总线的位数,⽽不是它的字长。如Intel P4处理器字长为32位,地址总线也是32位。8086的数据总线为16为,地址总线为20位(则可寻址的内存空间为2^20=1MB)。新兴的64位处理器的数据总线为64位,地址总线⼤部分是32位。再看地址总线与寻址范围的关系,存储单元是以Byte为单位,N根地址总线能够访问2^N个存储单元,于是有32为地址总线可访问2^32个存储单元,即4GB。
所以指针为了正确指⽰内存中的地址,必须按照地址总线的宽度进⾏变量的存储,因此虽说64位CPU
的数据宽度为64位⽽其地址总线⼀般不为64位(能访问的内存空间⼤的惊⼈,暂时估计应该还做不到),但是⼀般能超过32位,因此指针的长度⼤于4个字节(32位),所以64位机的指针字节为64位即8个字节,⽽32位机的地址总线⼀般为4个字节,即⽀持4GB的内存,则其指针的宽度为4个字节。
⼀)64位系统和32位有什么区别?
1、64bit CPU拥有更⼤的寻址能⼒,最⼤⽀持到16GB内存,⽽32bit只⽀持4G内存
2、64位CPU⼀次可提取64位数据,⽐32位提⾼了⼀倍,理论上性能会提升1倍。但这是建⽴在64bit操作系统,64bit软件的基础上的。
什么是64位处理器?
之所以叫做“64位处理器”,是因为电脑内部都是实⾏2进制运算,处理器(CPU)⼀次处理数据的能⼒也是2的倍数。8位处理器、16位处理器、32位处理器和64位处理器,其计数都是2的倍数。⼀次处理的数据越⼤,该电脑处理信息的能⼒越来越⼤;因此64位处理在先天就⽐32位处理器具有快速的能⼒。那为什么不⽤更⾼级的128位处理器呢?因为位数越⾼,处理器芯⽚的设计也就越复杂,⽬前的技术⽔平暂时⽆法制造这么复杂的芯⽚。
64位处理器之失
※硬件———缺乏驱动程序,很多现有硬件⽆法使⽤
※软件———操作系统不是问题,但是软件出现不兼容难题
64位处理器之得
※硬件———更快的执⾏速度,更⼤的内存管理
※软件———最新的尖端软件⾸先出现在64位平台
(⼆)数据类型对应字节数
程序运⾏平台
不同的平台上对不同数据类型分配的字节数是不同的。
个⼈对平台的理解是CPU+OS+Compiler,是因为:
1、64位机器也可以装32位系统(x64装XP);
梦见掉了一大把头发2、32位机器上可以有16/32位的编译器(XP上有tc是16位的,其他常见的是32位的);
公共场所礼仪
3、即使是32位的编译器也可以弄出64位的integer来(int64)。
以上这些是基于常见的wintel平台,加上我们可能很少机会接触的其它平台(其它的CPU和OS),所以个⼈认为所谓平台的概念是三者的组合。
虽然三者的长度可以不⼀样,但显然相互配合(即长度相等,32位的CPU+32位的OS+32位的Compiler)发挥的能量最⼤。
理论上来讲 我觉得数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算)。
常⽤数据类型对应字节数
可⽤如sizeof(char),sizeof(char*)等得出
32位编译器:
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
面试时英语自我介绍short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器:
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
最后补充unsigned类型和signed的区别:
整型的每⼀种都分为:⽆符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(c har有点特别),如果需声明⽆符号类型的话就需要在类型前加上unsigned。⽆符号版本和有符号版本的区别就是⽆符号类型能保存2倍于有符
号类型的正整数数据,⽐如16位系统中⼀个short能存储的数据的范围为-32768~32767,⽽unsigned能存储的数据范围则是0~65535。由于在计算机中,整数是以补码形式存放的。根据最⾼位的不同,如果是1,有符号数的话就是负数;如果是⽆符号数,则都解释为正数。另外,unsigned若省略后⼀个关键字,⼤多数编译器都会认为是u nsigned int。
unsigned正数表⽰范围是signed的2倍
类型
说明
tinyint⾮常⼩的整数
smallint较⼩整数
mediumint中等⼤⼩整数
int标准整数
bigint较⼤整数
float单精度浮点数
double双精度浮点数
decimal⼀个串的浮点数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。