精华内容
下载资源
问答
  • 2020-03-07 20:09:24

    bool 1字节;

    char 1字节;

    short 2字节;

    string 4字节;

    int 4字节;

    指针4字节;

    float 4字节;

    double 8字节;

    long 4或8字节

    long long 8字节;

    long double 12字节

    空类1字节;

    单一继承的空类空间1字节;

    多重继承的空类空间1字节;

    虚继承涉及虚表4字节

    更多相关内容
  • C语言中结构字节计算方法

    千次阅读 2021-05-19 10:44:49
    在讨论计算方法之前,我们先讨论一些概念,一个是偏移量,另一个是内存对齐. 让我来谈谈偏移量,百度百科将其定义为: 存储单元的实际地址与其所在的段的段地址之间的距离称为段内偏移量,也称为“有效地址”或抵消. ...

    47d4ab55643cbf4bc1415e90118de0e9.png

    在讨论计算方法之前,我们先讨论一些概念,一个是偏移量,另一个是内存对齐. 让我来谈谈偏移量,百度百科将其定义为: 存储单元的实际地址与其所在的段的段地址之间的距离称为段内偏移量,也称为“有效地址”或抵消. ”在结构中,它可能是指结构变量中成员地址与结构变量地址之间的差异. 然后谈谈内存对齐的概念: 当在内存中存储基本类型的数据时,计算机系统将对其位置有所限制. 系统将要求这些数据的第一个地址的值是某个数字的倍数,该数字称为数据类型的对齐模数. 尽管ANSI C标准没有强制要求相邻声明的变量在内存中应该相邻,但是编译器会自动帮助您解决此问题,即,相邻变量之间可能会填充一些字节. 因此,在此问题上,编译器有所不同.

    因此,我们首先来讨论结构变量在Microsoft编译器中的对齐方式

    1. 如果结构成员的第一个地址是其最宽的基本类型成员的整数倍. 当编译器为结构分配内存时,它首先找到最宽的基本成员,然后在内存中查找地址,并使用此最宽的基本数据类型的大小作为对齐模量

    2. 结构中每个成员相对于第一个地址的偏移量是成员大小的整数倍. 如果不满足此要求,则编译器将自动添加字节. 当为结构成员打开内存时计算结构体大小,编译器将首先检查已开发内存的第一地址与结构变量的第一地址之间的偏移量. 如果它是成员体的整数倍,则存储此变量,否则将在该成员和上一个成员之间填充字节以实现整数倍

    3. 如果结构占用的总内存大小是最大成员主体大小的整数倍,如果不是,则编译器将在末尾添加字节. 结构的最后一个成员不仅必须满足前两个原则,而且还必须满足最后一个条件.

    让我们看几个例子.

    fbe919bd7e0badbecb8220aea5a8d29d.gif

    struct std

    {

    字符a;

    int i;

    float b;

    };

    07142725-039fdca1a30734b2fc93d652724b40.png

    在VS 2017下,此结构的计算结果的大小为12. 然后将根据上述规则进行计算.

    第一个是char a. 字符大小为1,与第一个地址的偏移量为0,然后为整数i. int i的大小为4,与第一个地址的偏移量为1,但1不是4的整数倍,因此编译器将自动填充char a和int i之间的字节. 所以i的偏移量是4. float 4的大小偏移量是int i的偏移量加上int i的大小,因此float b的偏移量大小是8,而8是4的倍数,所以会有没有字节填充. 结构的大小自然是最后8 + 4 = 12

    由此也可以看出,结构的大小等于最后一个成员的大小加上其偏移量.

    所以让我们来看另一个例子

    struct std

    {

    20180120143600080606.png

    int i;

    int c;

    双b;

    字符a;

    };

    然后我们使用先前的算法进行计算,int i的大小为4,偏移量为0,int c的大小为4,偏移量为4,双精度b的大小为8,偏移量Is 8. char a的大小为1,偏移量为16. 那么此结构的变量的大小为16 +1 = 17吗?答案肯定不是. 在VS的sizeof计算下,结果是24计算结构体大小,为什么是24,则将使用前面提到的最后一个原理. 结构的大小确实等于最后一个成员的偏移加上最后一个成员的大小,但是如果结构不满足结构中最大成员大小的整数倍的条件,则编译器将自动填写最后一个单词符合要求,即尽管我们计算的结果是17、17并非8的倍数,所以编译器会自动填充末尾的字节以使其成为8的倍数,即,自动扩展为24. ,

    40bbda7ce070771f8e1126d89281173e.png

    然后让我们讨论一下GCC编译器下的模式. 在Windows环境中,将减少使用GCC编译器. 如果GCC编译器主要在Linux平台上使用,则它不遵循Microsoft编译器的某些准则,例如前面提到的对齐模数. Microsoft编译器下的对齐模数是结构成员中最大的大小,GCC编译器下的最大对齐模数只能是4. 这意味着对齐模数只能是1,2,4之一. 因此,我之前讨论的Microsoft编译器下的某些原理将稍有不同. 如果前面提到的成员的第一个地址的偏移量是成员大小的整数倍,则此处的偏移量会有所不同. 在GCC中,如果成员大小小于等于4的成员,则继续遵循先前的标准,但是如果成员大小大于4,则该结构的每个成员相对于该结构的第一个地址的偏移量只能是4的整数倍. 确定是否添加填充. 让我们看一个简单的例子.

    struct std

    {

    字符b;

    双c;

    };

    在此示例中,如果它基于Microsoft编译器,则计算的结构应为16,但在GCC编译器下为12. 原因如上所述.

    尽管从理论上讲这是正确的,但是当我尝试时,我发现上述操作的结果是16,是的,它是16而不是12!为什么?这种理论是错误的,当然不是. 我们可以尝试在GCC下计算sizeof(int *)(它是int *而不是int). 您会发现结果为8(如果为sizeof(int),则结果为4),输出为8,这解决了我们的疑问. 64位系统的长度默认为8,32位系统的默认值为4. 这可以合理地解释为什么计算结果是16而不是12.

    对齐模数的选择只能基于基本数据类型,因此结构嵌套结构就不会出现这种情况,因为稍后会添加其计算方法

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/jisuanjixue/article-204089-1.html

    展开全文
  • C语言字节序比特序

    2020-07-25 03:19:07
    1、大小端的概念;2、结构体和联合体存储方式;3、位域的概念。
  • 如何计算C语言结构占用的字节数

    千次阅读 2021-05-19 08:02:11
    对于格式一: int类型取4的整数倍,因为A占用一个字节后,B无法放置,因此打开一个新单元,然后打开一个新单元放入C,因此被占用的字节数格式之一是: 3 * 4 = 12; 类似地,对于第二种晶格e68a84e8a2ade799bee5baa6e...

    2-810-jpg_6-1080-0-0-1080.jpg

    全部展开

    结构的数据类型很多. 我们不会一long而就. 让我们直接看一下相同数据结构的几种书写格式.

    格式一:

    01.struct tagPhone

    02.{

    03.     char   A;

    04.     int    B;

    05.     short  C;

    06.}Phone;

    格式二:

    00243772.jpg

    01.struct tagPhone

    02.{

    03.     char   A;

    04.     short  C;

    05.     int    B;

    06.}Phone2;

    格式3:

    01.struct tagPhone3

    02.{

    03.     char   A;

    04.     char   B[2];

    05.     char   C[4];

    06.}Phone3;

    我们都知道char类型占1个字节,int类型占4个字节,short类型占2个字节,long类型占8个字节,double类型占16个字节;

    这时,我们可能直接添加1 + 4 + 2 = 7(这需要7个字节)来犯错. 这是错误的.

    i_3_3691943704x337553723_15.jpg

    以下是简要分析:

    在计算结构大小时需要考虑内存布局. 该结构按单位存储在内存中,每个单位的大小取决于该结构中最大的基本类型的大小.

    对于格式一:

    7c66e969d04381f86dae8a9361d6c807.png

    int类型取4的整数倍,因为A占用一个字节后,B无法放置,因此打开一个新单元,然后打开一个新单元放入C,因此被占用的字节数格式之一是: 3 * 4 = 12;

    11-810-jpg_6-1080-0-0-1080.jpg

    类似地,对于第二种晶格e68a84e8a2ade799bee5baa6e997aee7ad9431333337616465c 计算结构体大小,

    1d9e2829695a56fbb0de0226a665434e.png

    A后面有三个字节,足以存储C,因此C在A之后存储,然后打开一个新单元来存储B数据. 因此,格式2占用的内存字节为2 * 4 = 8.

    对于格式三:

    cf6e2ab8b2779692f910d77a2b5b45dc.png

    91a193160e0d694515bcf08e9c6d4878.png

    计算上述结构的大小,sizeof(Phone3)= 1 + 2 + 4 = 7,其大小是结构中字段大小的总和,这也是节省空间最多的方法写.

    摘要:

    第一种书写方式是空间被严重浪费. sizeof的sizeof计算与期望值不一致,但是保留了每个字段的数据类型. 这也是随便写作的最常见方式,对于大多数人来说,这样写很容易;

    第三种写方法,也是最节省空间的写方法,也是使用sizeof查找与预期大小相同的大小c 计算结构体大小,但是所有写方法都使用字节类型,从而丢失了字段的本机数据类型,使用起来很不方便;

    在第一和第三种书写方式之间的第二种书写方式在空间上更紧凑,同时保持了结构中字段的数据类型.

    只要您了解这些著作的不同之处,就可以适当选择.

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/jisuanjixue/article-214511-1.html

    展开全文
  • 对格式一: 以int型占用4个来作为倍数,因为A占用一个字节后,B放不下,所以开辟新的单元,然后开辟新的单元放C,所以格式一占用的字节数为:3*4=12; 同理对于格式二, A后面还有三个字节,足够C存放,所以C根着A...

    看到个写得比较好的博文,转给大家看看

     

    格式一:  

    1

    2

    3

    4

    5

    6

    01.struct tagPhone

    02.{

    03.     char   A;

    04.     int    B;

    05.     short  C;

    06.}Phone;

      格式二:

    1

    2

    3

    4

    5

    6

    01.struct tagPhone

    02.{

    03.     char   A;

    04.     short  C;

    05.     int    B;

    06.}Phone2;

      格式三:

    1

    2

    3

    4

    5

    6

    01.struct tagPhone3

    02.{

    03.     char   A;

    04.     char   B[2];

    05.     char   C[4];

    06.}Phone3;

    我们都知道,char类型占用1个字节,int型占用4个字节,short类型占用2个字节,long占用8个,double占用16个;

      那么我们可能会犯一个错误就是直接1+4+2=7,该结构体占用7个字节。这是错的。

    以下我们简单分析下:

      计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小。

      对格式一:

      

      

      以int型占用4个来作为倍数,因为A占用一个字节后,B放不下,所以开辟新的单元,然后开辟新的单元放C,所以格式一占用的字节数为:3*4=12;

      同理对于格式二,

      

      A后面还有三个字节,足够C存放,所以C根着A后面存放,然后开辟新单元存放B数据。所以格式二占用的内存字节为2*4=8.

      

      对于格式三:

      

      上面结构计算大小,sizeof(Phone3) = 1 + 2 + 4 = 7, 其大小为结构体中个字段大小之和,这也是最节省空间的一种写法。

      

      总结:

      第一种写法,空间浪费严重,sizeof 计算大小与预期不一致,但是保持了每个字段的数据类型。这也是最常见的漫不经心的写法,一般人很容易这样写;

     

      第三种写法,最节省空间的写法,也是使用 sizeof 求大小与预期一样的写法,但是全部使用字节类型,丢失了字段本生的数据类型,不方便使用;

    第二种写法,介于第一种和第三种写法之间,其空间上比较紧凑,7a686964616fe58685e5aeb931333337616465同时又保持了结构体中字段的数据类型。

     

      只要了解是这些写法的差异性,可以视情况选用。

     

    展开全文
  • 最近笔试经常遇到c语言各类型变量所占字节数的问题,这里做一个总结好了。
  • 最近笔试经常遇到c语言各类型变量所占字节数的问题,这里做一个总结好了。
  • C语言字节大小day5

    千次阅读 2021-05-19 08:00:54
    计算字节大小int, float, double 和 char 字节大小 F11运行 注解:长度就是有几个字符,字节就是这个字符数组共有几个元素。2.一个字节的长度为8bit,数据的长度由数据的类型来定义。一个英文字母(不分大小写)占一个...
  • C语言-结构体struct所占字节数计算

    千次阅读 2021-11-24 10:20:08
    C语言设计准测角度理解结构体所占字节数
  • 计算字节数*(在window环境下对齐参数与原字节数相等)* 第一原则:每个变量相对于结构体的首地址的偏移量必须是对齐参数的整数倍。 第二条原则:结构体变量所占空间的大小是对齐参数的整数倍。 结构体 结构体所占...
  • C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。
  • 本文就C语言字节对齐的问题进行详细的解析,感性趣的朋友可以看看。
  • c语言字节对齐

    2017-04-26 13:14:19
    c语言字节对齐
  • C语言中各类型所占字节数

    千次阅读 2021-12-05 21:53:07
    联合体中占用内存空间最大的字段加上填充字节(对齐字节后所需字节数)。 (2)枚举类型,指一个被命名的整型常数的集合。即枚举类型,本质上是一组常数的集合体,只是这些常数有各自的命名。枚举类型,是一种用户...
  • 本文介绍了C语言中有符号和无符号之间进行运算的规则。
  • 输出一个3位的正整数,输出其反序 #include<stdio.h> int main() { int number,a,b,c; number=123; printf("输出的三位为:%d\n",number); a=number/100; b=(number-a*100)/10; c=number%10; ...
  • 16位编译器char:1个字节char*:2个字节short int:2个字节int:2个字节unsigned int:2个字节long:4个字节long long:8个字节unsigned long:4个字节float:4个字节double:8个字节32位编译器char:1个字节char*:...
  • 以int型占用4个来作为倍数,因为A占用一个字节后,B放不下,所以开辟新的单元,然后开辟新的单元放C,所以格式一占用的字节数为:3*4=12;  同理对于格式二, A后面还有三个字节,足够C存放,所以C根着A...
  • C语言中如何计算结构体的字节大小

    千次阅读 2020-11-26 16:44:53
    计算结构体所占字节的大小时,不要直观地累加结构体内成员的字节大小,实际结构体存放在内存中是有一定的规则的,这里涉及的规则就是内存对齐原则。 声明一个结构体stu struct stu { char a; int b; double c; ...
  • C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码,8位的byte(字节)是常见的字符编码单位。但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码。  C95标准化了两种...
  • C语言(精讲系列)——常用数据类型所占用的字节数 突破点:数据类型所占的字节数与机器字长以及编译器都有关 常用类型 16位编译器 32位编译器 64位编译器 int 2 4 4 short int 2 2 2 char 1 1 1 float ...
  • C语言各变量类型占字节数

    千次阅读 2021-01-26 14:41:09
    C语言变量所占字节数整理: 变量的基本类型包括:字符型、整型、长整型、浮点型。 每个变量在每个编译器所占的字节数不同,《the C Programming language》是这样说的: Each compiler is free to choose ...
  • C语言字节对齐详解

    2021-05-19 09:23:36
    先了解4个基本概念:1、数据类型自身对齐值:即数据类型的大小(数组取数组成员类型的自身对齐值),如char的自身对齐值是1,short是2,int、float、double都是4,单位字节2、结构体的自身对齐值:结构体成员中自身...
  • 计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小,下面我们看几个例子:1.struct A{char a;int b;short c;}str1;这里char占1个字节,int占...
  • C语言:函数实现求字符串占内存单元字节 int f(char *s) { char *t=s; while(*t++) // 循环到\0结束, 但是t指针指向了\0后边的单元 return t-s; } 其中问题: 区分t++ 与 ++t的区别 \0的意义 指针的减法...
  • C语言浮点数转换四字节16进制工具,将浮点数转化为四字节
  • C语言)数组所占字节怎么算?

    千次阅读 2021-05-25 01:22:15
    C语言中有一个专门用于检测类型或变量或数组在内存中所占有的空间(字节数)的操作符sizeof,用它可以直接检测出数组在内存占有的字节数。语法规则是:sizeof(x);(识别没有歧义时也可写成sizeof x;)——其...
  • C语言字节对齐规则总结

    千次阅读 多人点赞 2018-10-23 16:16:30
     不同硬件平台,对存储空间的处理不一样,比如不能放奇数地址,不能任意存放等,为了适应不同的架构,在C语言层面上,就可以执行对齐从而独立于硬件平台。 此外,是由于对内存的存取效率问题,如果存放的地址不对齐...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 272,595
精华内容 109,038
关键字:

c语言字节数怎么计算

友情链接: s3c2440_wheel_driver.rar