c++数据类型大小及数值范围

C++数据类型
32位windows系统
数据类型 字节数
Bool 1
Char 1
Short 2
Int 4
Long 4
Long long 8
Float 4
Double 8
Long double 8
指针类型 4
64位windows系统
数据类型 字节数
Bool 1
Char 1
Short 2
Int 4
Long 8
Long long 8
Float 4
Double 8
Long double 16
指针类型 8

Struct类型的大小计算:
Struct的大小是最大对齐模数的整数倍。
每种基本数据类型的起始存储地址都是其字节大小的整数倍。比如int类型的变量要存放在起始地址是4的整数倍的空间,double类型要存放在起始地址是8的整数倍的空间,指针类型要存放在起始地址是4或8的整数倍的空间。
在struct中,按照每个成员的定义顺序分配空间。比如
Struct A{
Int a;
Char b;
Char * c;
Double d;
};
A的最大对齐模数是8,因为double的字节数是8。所以A的大小应该是8的整数倍。
为A分配空间按照a,b,c,d的顺序进行分配。A放在起始地址是4的整数倍的空间,b放在起始地址是1的整数倍的空间,c放在起始地址是4的整数倍的空间,d放在起始地址是8的整数倍的空间。所有的成员放在一个连续的空间里,因此,在为a,b分配空间后,为了满足c的要求,要把b后面的连续三个字节占用。为a,b,c分配空间后,已经占用了4+1+3+4=12个字节,起始地址不是8的倍数,要占用c后面的4个字节,再为d分配空间。因此,A的大小应该是4+1+3+4+4+8=24,24恰好是8的整数倍。

StructA中嵌套structB,则structB的最大对其模数不是其大小,而是其成员的最大对齐模数。Struct中如果含有数组,则按单个元素计算,而不是数组整体。比如
Struct B{
Char a[8];
};
Struct C{
Double a;
};
Struct D{
Int a;
Char * b
Struct B c;
};
Struct E{
Int a;
Char *b;
Struct C c;
};
StructB的最大对齐模数是1,structC的最大对齐模数是8。B的大小是8,C的大小是8。
StructD的最大对齐模数是4,StructE的最大对齐模数是8。D的大小是16,E的大小是16。

代码:
#include “pch.h”
#include
#include <stdlib.h>
using namespace std;
struct A
{
int a;
char b;
char * c;
double d;
};
struct B{
char a[8];
};
struct C{
double a;
};
struct D{
int a;
char * b;
struct B c;
};
struct E{
int a;
char b;
struct C c;
};
int main()
{
cout << “A的大小是” << sizeof(A) << endl;
cout << “B的大小是” << sizeof(B) << endl;
cout << “C的大小是” << sizeof© << endl;
cout << “D的大小是” << sizeof(D) << endl;
cout << “E的大小是” << sizeof(E) << endl;
cout << “int的大小是” << sizeof(int) << endl;
cout << “short的大小是” << sizeof(short) << endl;
cout << “long的大小是” << sizeof(long) << endl;
cout << “bool的大小是” << sizeof(bool) << endl;
cout << “char的大小是” << sizeof(char) << endl;
cout << “float的大小是” << sizeof(float) << endl;
cout << “double的大小是” << sizeof(double) << endl;
cout << “long double的大小是” << sizeof(long double) << endl;
cout << "void
的大小是" << sizeof(void*) << endl;
cout << "int的大小是" << sizeof(int) << endl;
cout << "float的大小是" << sizeof(float) << endl;
cout << "double的大小是" << sizeof(double) << endl;
cout << "char的大小是" << sizeof(char) << endl;
}
运行结果

基本数据类型的数值
对于不同的数据类型,它可以表示的数值范围不同,主要是因为它所占有的字节数不同。

Bool只有true和false两种,在数值上,0表示false,大于0的数表示true。
Signed char:占用一个字节,signed表示有符号位,这也是通常默认的char 的类型,signed一般不写出来。符号位占用最高的一位,0/1表示正数或负数,剩余7位表示数值的绝对值。Signed char的数值范围是-(27)~27-1;
Unsigned 插入:占用一个字节,unsigned表示没有符号位,一个字节的8位数都表示数值,范围是0~2^8;
Signed int:占用四个字节,signed的作用同上,一般的整数也是有符号整数,signed也不写出来。符号位占用最高的一位,0/1表示正数或负数,剩余31位表示数值的绝对值。Signed int的表示范围是-(231)~231-1;
Unsigned int:占用四个字节,unsigned表示没有符号位,四个字节都表示数值,范围是0~2^32-1;
Signed short:占用两个字节,signed表示有符号位,short的默认类型,signed一般不写,最高位表示正数或负数。数值范围是-(215)~215-1;
Unsigned short:占用两个字节,unsigned表示无符号位,两个字节都表示数值,范围是0~2^16-1;
同理signed long的数值范围是-(231)~231-1,unsigned long的数值范围是0~2^32-1。

Float的数值范围是±3.4e±38
Double的数值范围是±1.7±3.8
Long double的数值范围是±1.7±4932
原理还在了解中。。。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值