位域和sizeof

2023-10-19 12:33
文章标签 sizeof 位域

本文主要是介绍位域和sizeof,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么打印出来的结果是不一样的,unsigned   field3给定不同的位字段打印出来的值不一样,而且既然声明为unsigned   field3为什么按%d打出来还是-4?而sizeof(struct   BitField)的值始终是8,我是在gcc下测试的.  
   
  #include   <stdio.h>  
   
  struct   BitField   {  
          int   field1   :   10;  
          signed   field2   :   8;  
          unsigned   field3   :   24;  
  };  
   
  struct   Bit   {  
          int   field1   :   10;  
          signed   field2   :   8;  
          unsigned   field3   :   32;  
  };  
   
  int   main(void)  
  {  
          struct   BitField   bitfiled;  
          struct   Bit   bit;  
           
          bitfiled.field1   =   -5;  
          bitfiled.field2   =   -3;  
          bitfiled.field3   =   -4;  
          printf("bitfiled.field1   =   %d,   bitfiled.field2   =   %d,   bitfiled.field3   =   %ul/n",    
                          bitfiled.field1,   bitfiled.field2,   bitfiled.field3);  
          printf("sizeof(struct   BitField)   =   %d/n",   sizeof(struct   BitField));  
                                   
          bit.field1   =   -5;  
          bit.field2   =   -3;  
          bit.field3   =   -4;  
          printf("/nbit.field1   =   %d,   bit.field2   =   %d,   bit.field3   =   %ul",    
                          bit.field1,   bit.field2,   bit.field3);  
          printf("/nbit.field1   =   %d,   bit.field2   =   %d,   bit.field3   =   %d/n",    
                          bit.field1,   bit.field2,   bit.field3);  
          printf("sizeof(struct   Bit)   =   %d/n",   sizeof(struct   Bit));  
           
           
          return   0;  
  }  
   
  =======================================================  
   
  执行结果:  
   
  bitfiled.field1   =   -5,   bitfiled.field2   =   -3,   bitfiled.field3   =   16777212l  
  sizeof(struct   BitField)   =   8  
   
  bit.field1   =   -5,   bit.field2   =   -3,   bit.field3   =   4294967292l  
  bit.field1   =   -5,   bit.field2   =   -3,   bit.field3   =   -4  
  sizeof(struct   Bit)   =   8

 

这篇关于位域和sizeof的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/239794

相关文章

sizeof与strlen函数的区别

strlen是函数,而sizeof是算符 strlen函数,用来求字符串的长度,sizeof函数是用来求指定变量或变量类型(操作数)等所占用内存的大小且存储大小由操作数的类型决定。   若操作数具有类型char、unsigned char或signed char,其结果等于1。 ANSI C正式规定字符类型为1字节。 其他类型:int(4)、unsigned int(4) 、shor

sizeof 关键字实现原理

sizeof 是 C 语言中的一个关键字,它用于计算某个类型或变量所占用的内存大小。sizeof 关键字在编译时由编译器处理,它的实现与具体的编译器和平台有关。 1.sizeof工作原理 在高级层面上,sizeof 的工作原理如下: 编译时计算:sizeof 是在编译时计算的,而不是在运行时执行。编译器通过分析变量或类型来确定其在目标平台上所占用的内存大小。由于 sizeof 是在编译时计

【POJ3268】【Silver Cow Party】【反向dij】【sizeof失效】

Silver Cow Party Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 15522 Accepted: 7039 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going

关键字之sizeof

接下来我讲的是之前我提到过的C语言关键字 sizeof同时它也是C语言提供的操作符(运算符) 它的使用形式有两种 1 sizeof(类型) 2 sizeof 表达式 sizeof返回某种数据类型或某个值占用的字节数量,它的参数可以是数据类型的关键字,也可以是变量名或某个具体的值。 sizeof不仅仅可以计算内置的类型的大小,计算数组、自定义类型的大小都是可以的。 1 #incl

数组名是指针,为什么sizeof(数组名)还是数组的大小

数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。这种误解的根源在于国内某著名的C程序设计教程(出版量最多的那本破书)。 数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;指向

15. 位域的定义,使用场景、使用技巧及注意点

1. 位域的定义 位域(bit-field)是 C 语言和 C++ 中的一种特殊结构体成员类型,用于定义占用特定位宽的成员。它允许我们精确控制每个成员使用的位数,而不是字节,常用于存储和传输结构中节省内存或表示紧凑的位级数据。 位域的语法如下: struct {type member_name : number_of_bits;}; type:必须是整型类型(如 int、unsigne

C++ class的各种sizeof

测试环境  visual express 2013 // ConsoleApplication1.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<iostream>using namespace std;class hollow //size 1,为了在内存中给其对象分配一个独一无二的地址,编译器自动给其增加一个char成员变量{}

E30.【C语言】练习:sizeof和strlen的习题集(B)

Exercise 4:sizeof 字符串 求下列代码打印结果 #define CRT_NO_WARNINGNESS 1#include <stdio.h>#include <string.h>int main(){char arr[] = "abcdef";printf("%zd\n", sizeof(arr));printf("%zd\n", sizeof(arr + 0));pr

79.位域

目录 一.位域的概念 二.语法格式 三.无名位域 四.视频教程 一.位域的概念 有些数据在存储的时候并不需要一个完整的字节。比如使用一个变量表示开关的状态,开关只有开和关俩个状态,所以只需要使用0和1表示,也就是一个二进制位。所以这时候使用一个完整的字节就比较浪费内存,正是基于这种考虑,C语言提供了一种数据结构,叫做位域。 二.语法格式 在结构体成员后面使用冒号(:)和

sizeof计算类的大小

关于sizeof与strlen的部分内容参考该文章 先看一个空的类占1字节? class Base { public: Base(); ~Base(); };     注意到我这里显示声明了构造跟析构,但是sizeof(Base)的结果是1.      因为一个空类也要实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样空类也