簡體   English   中英

以位為單位定義ac類型

[英]Define a c type in bits

我想知道你是否可以用比特定義一個類型。 具體來說,我想定義一個24位類型,以便在RTP中存儲丟失的累計包數。

如果沒有,我如何從int中記憶3個字節。 如果我這樣做,我不確定它會如何結束:

memcpy(pkg + 29, (&clamped_pkgs_lost)+(sizeof(char)), 3*sizeof (char));

您可以使用位域定義至少24位的類型,但是位域必須是struct的成員:

struct {
    unsigned pkgs_lost: 24;
};

無論是使用這樣的位域,還是僅使用至少24位像unsigned long的簡單類型來將值存儲到應用程序中,當您將其復制到RTP數據包時,最簡單的可移植方式是將其復制到一個字節一時間 這是因為RTP數據包中的值始終是big-endian,並且主機的字節順序未知。

假設pkgunsigned char *類型,你可以這樣做:

pkg[33] = pkgs_lost >> 16;
pkg[34] = pkgs_lost >> 8;
pkg[35] = pkgs_lost;

將24位大端數字放在輸出數據包的字節位置33。

在C中,您只能根據其基本類型或位域來定義整數類型。

比特菲爾德很古怪。 你不能拿他們的地址。 如果您只需要24位,它們將不會為您節省任何空間,但您的平台只有8位,16位和32位的基本類型。 您仍然需要使用3個8位整數或1個32位整數(或1個16位和1個8位)來存儲您的24位。

對於像計數器這樣簡單的東西,我只使用32位整數。 如果我有興趣將其限制為24位值,我有兩個選擇:

  • 歸零8個最重要的位,從而模擬環繞
  • 將值限制為2 24 -1,因此它永遠不會超出它,也不會纏繞

您可以將較大的整數存儲在較大的整數中。 只需屏蔽你想要的位。

int main() {
    long data;
    data & 0xFFFFFF;
}

或者,您可以在結構成員上定義位域。 但是不要嘗試將結構寫入磁盤並在不同的系統上打開它,因為位域布局不是標准化的

struct {
    long data:24;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM