C++数据类型大小

一、字节和字长
字节,八位就是一个字节,是固定概念。字长是指计算机一次能处理的二进制数据的长度,是一个非固定的概念。例如,8位计算机的字长为8,即一个字节,32位计算机的字长位32,即4个字节,同理,64位计算机的字长为64,即8字节。


二、C++中的数据类型
1、字符型数据char,该类型始终是一个字节长,即8位。

2、整形int、短整型short和长整形long。通常int为一个字长,short为半个字长,long为一个或2个字长(在32位机器中为一个字长)。在不同的软硬件环境下,int,short,long的长度可能不一样,但可以确定的是16(位)<=short<=int<=long,long>=32(位)
3、浮点型float、双精度double、和长双精度longdouble,分别表示单精度浮点数双精度浮点数和扩展精度的浮点数值。典型情况下,float为一个字,double是两个字,longdouble为三个或四个字。
4、在32位机上,所有指针类型变量占用内存字节数都为4。因为32位机就是4字节 *8个二进制位/字节计算出来的。如果在64位机上,指针占用内存大小就是:8个字节。


三、说明符(specifier
有四种说明符:long,short, signed和unsigned
long和short修改数据类型具有的最大值和最小值。一般的int必须至少有shortint型的大小。
整数类型的大小等级是:shortint, int, longint。只要满足最大/最小值的要求,所有的大小都可以看成一样的,例如,在64位字的机器上,所有的数据类型都可能是64位的。当用short或long改变int时,关键字int是可选的。
浮点数的大小等级是:float、double和longdouble。longfloat是不合法的类型,也没有short浮点数。
signed和unsigned修饰符告诉编译器怎样使用整数类型和字符的符号位(浮点数总含有一个符号)。unsigned数不保存符号,因此有一个多余的位可用,所以它能存储比signed数大两倍的正数。signed是默认的,只有char才一定要使用signed;char可以默认为signed,也可以不默认为signed。通过规定signedchar,可以强制使用符号位。

四、C语言数据类型字节数
32位编译器 :
指针:4
char:1
int:4
unsigned int:4
short int:2

long:4
unsigned long:4

float:4
double:8


64位编译器:
char:1个字节
char*(即指针变量):8个字节


shor tint : 2个字节
int: 4个字节
unsigned int :4个字节


float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节


BOOL和bool

1、类型不同
bool为布尔型
BOOL为int型
2、长度不同
bool只有一个字节
BOOL长度视实际环境来定,一般可认为是4个字节
3、取值不同
bool取值false和true,是0和1的区别; false可以代表0,但true有很多种,并非只有1。
        如果数个bool对象列在一起,可能会各占一个Byte,这取决于编译器。
BOOL是微软定义的typedef int BOOL(在windef.h中)。与bool不同,它是一个三值逻辑,
TRUE/FALSE/ERROR,返回值为大于0的整数时为TRUE,返回值为0时候,为FALSE,返回值为-1时为ERROR。


(2)结构体对齐:
原则1:数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
原则2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(structa里存有structb,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
原则3:收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
原则4:以上讲的都是在没有#pragmapack()宏的情况,如果有#pragmapack宏,对齐方式按照宏的定义来。
一般地,可以通过下面的方法来改变缺省的对界条件:
·使用伪指令#pragmapack (n),编译器将按照n个字节对齐;
·使用伪指令#pragmapack (),取消自定义字节对齐方式。
注意:如果#pragmapack (n)中指定的n大于结构体中最大成员的size,则其不起作用,结构体仍然按照size最大的成员进行对界。
例如:
#pragma pack (n)
struct naturalalign
{
   char a;
   int b;
   char c;
};
#pragma pack ()
当n为4、8、16时,其对齐方式均一样,sizeof(naturalalign)的结果都等于12。而当n为2
时,其发挥了作用,使得sizeof(naturalalign)的结果为8。
(3)struct位域的定义
所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。 使用位域的主要目的是压缩存储,其大致规则为:
1)如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2)如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3)如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4)如果位域字段之间穿插着非位域字段,则不进行压缩;
5)整个结构体的总大小为最宽基本类型成员大小的整数倍。
让我们来看看例子:
例4:structA{
char f1 : 3;
char f2 : 4;
char f3 : 5;
};
a b c
A的内存布局:111, 1111*, 11111 * * *
例5:struct B{
char f1 : 3;
short f2 : 4;
char f3 : 5;
};
由于相邻位域类型不同,在VC6中其sizeof为6,在Dev-C++中为2。
(在设计结构体的时候,一般会尊照一个习惯,就是把占用空间小的类型排在前面,占用空间大的类型排在后面,这样可以相对节约一些对齐空间。)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值