位域

有些信息在存儲時,并不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,并使處理簡便,C語言又提供了一種數據結構,稱為“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分為幾個不同的區域, 并說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。
一、位域的定義和位域變量的說明位域定義與結構定義相仿,其形式為:?

struct 位域結構名 
{位域列表};

其中位域列表的形式為:

類型說明符 位域名位域長度

位域變量的說明與結構變量說明的方式相同。 可采用先定義后說明,同時定義說明或者直接說明這三種方式。例如:

struct bs
{int a:8;int b:2;int c:6;
}data; 

說明data為bs變量,共占兩個字節。其中位域a占8位,位域b占2位,位域c占6位。對于位域的定義尚有以下幾點說明:


1.?一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:

struct bs
{unsigned a:4unsigned b:5 /*從下一單元開始存放*/unsigned c:4
}

2. 由于位域不允許跨兩個字節,因此位域的長度不能大于一個字節的長度

3.?位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:

struct k
{int a:1int :2 /*無位域名,該2位不能使用*/int b:3int c:2
}; 
二、位域的使用
#include <iostream>
#include <memory.h>
using namespace std;
struct A
{int a:5;int b:3;
};
int main(void)
{char str[100] = "0134324324afsadfsdlfjlsdjfl";struct A d;memcpy(&d, str, sizeof(A));cout << d.a << endl;cout << d.b << endl;return 0;
}

解析:在默認情況下,為了方便對結構體內元素的訪問和管理,當結構體內的元素長度都小于處理器的位數的時候,便以結構體里面最長的元素為對其單位,即結構體的長度一定是最長的數據元素的整數倍;如果有結構體內存長度大于處理器位數的元素,那么就以處理器的位數為對齊單元。由于是32位處理器,而且結構體中a和b元素類型均為int(也是4個字節),所以結構體的A占用內存為4個字節。

上例程序中定義了位域結構A,兩個個位域為a(占用5位),b(占用3位),所以a和b總共占用了結構A一個字節(低位的一個字節)。

當程序運行到14行時,d內存分配情況:

高位 00110100 00110011   00110001    00110000 低位'4'       '3'       '1'          '0'  其中d.a和d.b占用d低位一個字節(00110000),d.a : 10000, d.b : 001

?d.a內存中二進制表示為10000,由于d.a為有符號的整型變量,輸出時要對符號位進行擴展,所以結果為-16(二進制為11111111111111111111111111110000)

?d.b內存中二進制表示為001,由于d.b為有符號的整型變量,輸出時要對符號位進行擴展,所以結果為1(二進制為00000000000000000000000000000001)

?

轉載于:https://www.cnblogs.com/13224ACMer/p/6298764.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253524.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253524.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253524.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數字后端——ECO

目錄 一、概述 二、ECO分類 1、按時間節點 1&#xff09;流片前的ECO 2&#xff09;流片過程的ECO 3&#xff09;流片后的ECO 2、按網表是否改變 1&#xff09;功能ECO 2&#xff09;時序ECO 三、ECO處理內容 1、設計規則違例 1&#xff09;提升標準單元驅動力 2…

Uncaught TypeError: Cannot read property 'length' of null錯誤怎么處理?

Uncaught TypeError: Cannot read property length of null 錯誤怎么處理&#xff1f; 1.可能是返回的datagrid數據格式有問題&#xff0c;比如{"total":0,"rows":null}&#xff0c;改為{"total":0,"rows":"[]"}就可以了 if…

電視百科常識 九大視頻接口全接觸

1 射頻 天線和模擬閉路連接電視機就是采用射頻&#xff08;RF&#xff09;接口。作為最常見的視頻連接方式&#xff0c;它可同時傳輸模擬視頻以及音頻信號。RF接口傳輸的是視頻和音頻混合編碼后的信號&#xff0c;顯示設備的電路將混合編碼信號進行一系列分離、解碼在輸出成像。…

tracert路由檢測命令使用方法

很多客戶網站無法訪問的時候都會第一時間懷疑是虛擬主機有問題了&#xff0c;其實大多時候網站無法訪問和很多因素相關&#xff0c;包括自己的網絡、計算機設置、省際路由等等&#xff1b; 那么這里我就簡單講下如何利用DOS下的命令檢測你的計算機到服務器之間的路由是否通暢&a…

數字后端——物理單元介紹

物理單元&#xff08; physical cell&#xff09;指沒有邏輯功能但是具有物理實現功能的標準單元&#xff0c; 用于抑制芯片生產過程中的各類物理效應&#xff0c; 保證芯片生產后能夠正常工作 。硬核位置確 定后&#xff0c;需要插入物理單元消除影響芯片工作的物 效應&#x…

vue雙向數據綁定的原理

有關雙向數據綁定的原理 最近兩次面試的時候&#xff0c;被問到了vue中雙向數據綁定的原理&#xff0c;因為初學不精&#xff0c;只是使用而沒有深入研究&#xff0c;所以答不出來。之后就在網上查找了別人寫的博客&#xff0c;學習一下。 下面是博客園一篇博客&#xff0c;以及…

求職網站總結

最近忙著要找份工作。畢業半年多就辭職&#xff0c;也是尷尬。 這里記錄一些求職網站和找工作的一些經驗。主要參考了三個知乎問題&#xff1a;怎么在互聯網上找工作&#xff1f;&#xff0c;招聘網站&#xff0c;哪個靠譜&#xff1f;和哪個求職網站&#xff08;app&#xff0…

FTP命令解析

FTP命令詳解FTP命令是Internet用戶使用最頻繁的命令之一&#xff0c;不論是在DOS還是UNIX操作系統下使用FTP&#xff0c;都會遇到大量的FTP內部命令。熟悉并靈活應用FTP的內部命令&#xff0c;可以大大方便使用者&#xff0c;并收到事半功倍之效。   FTP的命令行格式為&…

深入Java內存模型

你可以在網上找到一大堆資料讓你了解JMM是什么東西&#xff0c;但大多在你看完后仍然會有很多疑問。happen-before是怎么工作的呢&#xff1f;用volatile會導致緩存的丟棄嗎&#xff1f;為什么我們從一開始就需要內存模型&#xff1f; 通過這篇文章&#xff0c;讀者可以學習到足…

Matlab 使用GPU加速 轉載

在matlab中使用GPU加速&#xff0c;來加速矩陣運算。 首先如前面所說&#xff0c;并不是所有GPU都能在maltab中進行加速的&#xff0c;貌似只有NVDIA的顯卡可以吧。 硬件&#xff1a;GeForce GTX 980 軟件&#xff1a;Matlab 2015a &#xff08;Matlab 2012以后的版本才帶有GP…

數字后端——可制造性設計

隨著集成電路制造工藝技術的迅速發展&#xff0c;集成電路集成度迅速攀升&#xff0c;制造流程及工藝步驟日趨復雜&#xff0c;工藝尺寸也在不斷縮小。集成電路可制造性設計&#xff08;Design For Manufacturability,DFM&#xff09; 以直接提升集成電路芯片的良品率及降低芯片…

Cloudstack安裝(二)

Cloudstack安裝 官方文檔參考&#xff1a; http://docs.cloudstack.apache.org/projects/cloudstack-installation/en/4.9/qig.html#environment Cloudstack主要分Management和Agent兩部分。 系統版本&#xff1a;CentOS 6.8 Management&#xff1a; cpu1&#xff0c;ram 2048M…

Pycharm 輸出中文或打印中文亂碼現象的解決辦法

轉載地址&#xff1a;https://www.cnblogs.com/Bro-Young/p/5920884.html 1. 確保文件開頭加上以下代碼&#xff1a; 1 # -*- coding:utf-8 -*- 還可以加上 1 import sys 2 reload(sys) 3 sys.setdefaultencoding(utf-8) 確保以下。 如果還是沒有解決中文亂碼&#xff0c;那么進…

計算機系統結構——概述

計算機的實現包括兩個方面&#xff1a;組成和硬件。組成一詞包含了計算機設計的高階內容&#xff0c;例如存儲器系統&#xff0c;存儲器互連&#xff0c;設計內部處理器 CPU &#xff08;中央處理器——算術、邏輯、分支和數據傳送功能都在內部實現&#xff09;。有時也用微體系…

BestCoder Round #91 1001 Lotus and Characters

題目鏈接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid6011 題意&#xff1a; Lotus有nn種字母&#xff0c;給出每種字母的價值以及每種字母的個數限制&#xff0c;她想構造一個任意長度的串。 定義串的價值為&#xff1a;第1位字母的價值*1第2位字母的價值*2第3位字…

Calendar的那些神坑

參考我的博客&#xff1a;http://www.isedwardtang.com/2017/08/31/java-calendar-bug/轉載于:https://www.cnblogs.com/EdwardTang/p/7476781.html

mkyaffs2image的用法

在Ubuntu中第一次使用mkyaffs2image命令時&#xff0c;會提示 mkyaffs2image&#xff1a;找不到命令 還需要安裝mkyaffs2image http://code.google.com/p/fatplus/downloads/detail?nameyaffs2-source.tar&can2&q 下載yaffs2-source.tar 解壓后&#xff0c;進入util…

全景圖像拼接——基本流程

圖像拼接技術是數字圖像處理技術一個重要的研究方向,它即是將兩幅或多幅相互有部分重疊的場景照片拼接成具有超寬視角、與原始圖像接近且失真小、沒有明顯縫合線的高分辨率圖像。可以很好地解決廣角鏡、魚眼鏡頭等全景圖獲取設備的不足。如下圖: 圖像拼接產生的圖像不…

SmartRaiden 和 Lighting Network 進行去中心化跨鏈原子資產交換

SmartRaiden 和 Lighting Network 進行去中心化跨鏈原子資產交換 前言 如果能夠進行以太坊和比特幣跨鏈原子資產交換&#xff0c;是不是一件很酷的事情&#xff1f; 目前鏈下的擴容方式有很多&#xff0c;最廣為人知的就是比特幣的閃電網絡和以太坊的雷電網絡&#xff0c;今天我…

WPF 帶CheckBox、圖標的TreeView

WPF 帶CheckBox、圖標的TreeView 在WPF實際項目開發的時候&#xff0c;經常會用到帶CheckBox的TreeView&#xff0c;雖然微軟在WPF的TreeView中沒有提供該功能&#xff0c;但是微軟在WPF中提供強大的ItemTemplate模板功能和自定義樣式&#xff0c;那我們可以自己寫一個這樣的控…