c++中各种类型数据类型占据字节长度

首先罗列一下C++中的数据类型都有哪些:

1、整形:int、long

2、字符型:char、wchar_t

3、布尔型:bool

4、浮点型:float、double

5、指针

一、整形

  int占据操作系统一个内存单元的大小。long跟int相同

  早先16位操作系统一个内存单元是16位,所以是2个字节;32位系统一个内存单元是是32位,所以是4字节;64位操作系统一个内存单元是16位,故占8个字节。

二、字符型

  char类型通常占据一个字节,对于用于扩展字符集的wchar_t类型,需要占据两个字节。

三、布尔型

  bool占据一个字节

四、浮点型

  float占据4个字节,double是float的两倍即8个字节

五、指针

  指针字节长度计算原理其实跟int差不多,一个指针的位数和操作系统的位数是相等的,即32位系统应该是4个字节,64位系统应该是8个字节。

代码如下

1 #include<iostream>                                                     
 2
 3 using namespace std;
 4
 5 int main()
 6 {
 7     int a;
 8     long b;
 9     char c;
10     wchar_t d;
11     bool e;
12     float f;
13     double g;
14     int*p= &a;
15
16     cout << sizeof(a) << endl;
17     cout << sizeof(b) << endl;
18     cout << sizeof(c) << endl;
19     cout << sizeof(d) << endl;
20     cout << sizeof(e) << endl;
21     cout << sizeof(f) << endl;
22     cout << sizeof(g) << endl;
23     cout << sizeof(p) << endl;
24 }

结果如下

qqtsj@qqtsj-Nitro-AN515-:~/cpp$ g++ -o size1 size1.cpp
qqtsj@qqtsj-Nitro-AN515-:~/cpp$ ./size1 4

字节对齐,代码如下

  #include<iostream>

  using namespace std;

  struct A
{
int a;
char b;
short c;
}; struct B
{
char a;
int b;
short c;
}; struct E
{
short a;
char b;
int c;
}; #pragma pack(2)
struct C
{
char a;
int b;
short c;
}; #pragma pack(1)
struct D
{
int a;
char b;
short c;
}; int main(int argc, char ** argv)
{ cout << sizeof(A) << " "<< sizeof (B) << " "<< sizeof (C) << " "<< sizeof (D) << " "<< sizeof (E) << endl;
return ;
}
~

记录一下如何理解字节对齐,结构体中总是会涉及到字节对齐,很多人都不是很理解,我也一样,今天就一起来解读他。

1.编译器对字节对齐的一些规则

  我从下面三条说明了编译器对字节处理的一些原则。当然除了一些特殊的编译器在处理字节对齐的方式也不一样, 这些情况我未碰到过,就不作说明了。

  a. 关于数据类型自身的对齐值,不同类型会按不同的字节来对齐。
类型 对齐值(字节)
char 1
short 2
int 4
float 4
double 4
      b. 类、结构体的自身对齐字节值。对于结构体类型与类对象的对齐原则:使用成员当中最大的对齐字节来对齐。比如在Struct A中,int a的对齐字节为4,比char,short都大,所以A的对齐字节为4
     c. 指定对齐字节值。意思是指使用了宏 #pragma pack(n)来指定的对齐值

d. 类、结构及成员的有效对齐字节值。有效对齐值=min(类/结构体/成员的自身对齐字节值,指定对齐字节值)。   有效对齐值决定了数据的存放方 式,sizeof 运算符就是根据有效对齐值来计算成员大小的。简单来说, 有效对齐其实就是要求数据成员存放的地址值能被有效对齐值整除,即:地址值%有效对齐值=0

字节对齐一般默认4个字节对齐。字节分配一般以偶数分配。

32位系统默认4个字节进行对齐,64位系统默认8个字节对齐,

一个字节占8位。

例struct A

int 4个字节

char 与int 对齐,因为char分配了4个字节,short 2个字节,可以分配到char里面

因此结构体A就总共分配了8个字节。

以下的结构体都是这样分析的。

一个小白的总结

c++中各类型数据占据的字节长度的更多相关文章

  1. c++中各类型数据所占字节数(二)

    转自:https://blog.csdn.net/allen_tony/article/details/76973906 https://blog.csdn.net/zzwdkxx/article/d ...

  2. c++中各类型数据所占字节数(一)

    转自: https://blog.csdn.net/hi_baymax/article/details/82415896 和机器字长及编译器有关系: 所以,int,long int,short int ...

  3. .SQL Server中 image类型数据的比较

    原文:.SQL Server中 image类型数据的比较 在SQL Server中如果你对text.ntext或者image数据类型的数据进行比较.将会提示:不能比较或排序 text.ntext 和 ...

  4. - Java中boolean类型占用多少个字节 MD

    目录 目录 Java中boolean类型占用多少个字节 1个bit(1位) 1个Byte(1字节,8位) 4个Byte(4字节,32位) 分析 官方文档中的描述 Markdown版本笔记 我的GitH ...

  5. Java中boolean类型占用多少个字节?我说一个,面试官让我回家等通知

    摘自:https://www.cnblogs.com/qiaogeli/p/12004962.html 程序员乔戈里 腾讯面试官问我Java中boolean类型占用多少个字节?我说一个,面试官让我回家 ...

  6. DELPHI中枚举类型数据的介绍和使用方法

    在看delphi程序的时候看到aa=(a,b,c,d);这样的东西,还以为是数组,同事说是函数,呵呵,当然这两个都不屑一击,原来这样式子是在声明并付值一个枚举类型的数据.下边写下来DELPHI中枚举类 ...

  7. 整型变量修饰符,char类型数据存储原理,字节数,

    //------------------整型变量修饰符 修饰符(int short long longlong signed unsigned)所有修饰符都是用来修整形 int 4short %hd ...

  8. java中不同类型的数值占用字节数

    在Java中一共有8种基本数据类型,其中有4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型和1种用于表示真值的boolean类型.(一个字节等于8个bit) 1.整型 类型 ...

  9. MySQL中enum类型数据,要传入字符串

    问题来源:公司业务,某张表中一个字段定义为: enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL DEFAULT '0' 某天跑脚本 ...

随机推荐

  1. redis集群数据迁移txt版

    ./redis-trib.rb create --replicas 1 192.168.112.33:8001 192.168.112.33:8002 192.168.112.33:8003 192. ...

  2. Linux下自动化部署ASP.NET CORE 3.1(Docker+Jenkins+Nginx)

    1.先配置好Docker阿里云加速,可以使用阿里云容器服务 (可自己在阿里云申请,要不然安装东西直接很慢)注意:https://XXXX.mirror.aliyuncs.com为阿里云加速服务分配地址 ...

  3. K8S集群搭建

    K8S集群搭建 摘要 是借鉴网上的几篇文章加上自己的理解整理得到的结果,去掉了一些文章中比较冗余的组件和操作,力争做到部署简单化. K8S组件说明 Kubernetes包含两种节点角色:master节 ...

  4. 【已解决】CentOS7使用yum安装Docker显示错误:cannot find a valid baseurl for repo: base/7/x86_64

    不得不说,Docker 要求 CentOS 系统的内核版本高于 3.10,这就让有些人开始头疼了,而要查看具体的版本可以用以下命令 uname -r 当然,CentOS 6.8版本也能安装Docker ...

  5. zabbix监控web应用日志报警并发送消息到钉钉

    首先在钉钉上开启钉钉机器人功能 说明:自定义关键词是zabbix发送过来的消息内容必须含有你定义的ERROR或者error字段,否则消息无法发送过来 ip地址段:一般都是zabbix-server的I ...

  6. 关于javaweb开发的环境搭建(一)Tomcat

    进行Tomcat的下载及环境配置 1.下载地址   http://tomcat.apache.org/ 2.下载的注意事项   下载的Tomcat版本要与自身电脑安装的java版本相匹配,下载时,点击 ...

  7. MySQL数据库(五)插入操作

    前提要述:参考书籍<MySQL必知必会> <MySQL必知必会>是先讲了查询,但是没有记录就无法查询,所以先将如何添加数据. 表已经知道怎么创建了,随便创两张. 5.1 插入数 ...

  8. 【Java基础总结】数据库编程

    MySQL数据库查询 import java.sql.*; public class JdbcDemo1{ public static void main(String[] args){ try{ / ...

  9. cannot insert multiple commands into a prepared statement问题原因及解决办法

    问题是这样,我在对数据库进行写操作(添加.删除.修改)时,我想同时删除两个表中的两条关联数据,像这样 let sql = ` DELETE FROM bridge_parts WHERE id = $ ...

  10. ubuntu下报错Sub-process /usr/bin/dpkg returned an error code (1)的解决方法

    cd /var/lib/dpkg sudo mv info info.bak #即备份一个info sudo mkdir info #新建一个新的info目录 然后采用以下命令重装那些出错的软件包 s ...