以位为单位定义c类型

时间:2013-04-22 03:06:27

标签: c typedef

我想知道你是否可以用比特定义一个类型。 具体来说,我想定义一个24位类型,以便在RTP中存储丢失的累计包数。

如果没有,我如何从int中记忆3个字节。 如果我这样做,我不确定它会如何结束:

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

3 个答案:

答案 0 :(得分:2)

您可以使用位域定义至少24位的类型,但是位域必须是struct的成员:

struct {
    unsigned pkgs_lost: 24;
};

无论是使用这样的位域,还是只使用至少24位像unsigned long这样的简单类型来存储应用程序中的值,当您将其复制到RTP数据包时,最简单的可移植方式是一次复制一个字节。这是因为RTP数据包中的值始终是big-endian,并且主机的字节顺序未知。

假设pkg的类型为unsigned char *,您可以执行以下操作:

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

将24位大端序列号放在输出包中的字节位置33处。

答案 1 :(得分:1)

在C中,您只能根据基本类型或位域来定义整数类型。

Bitfields古怪。你不能拿他们的地址。如果您只需要24位,它们将不会为您节省任何空间,但您的平台只有8位,16位和32位的基本类型。你仍然需要使用3个8位整数或1个32位整数(或1个16位和1个8位)来存储你的24位。

对于像计数器这样简单的东西,我只使用32位整数。如果我有兴趣将其限制为24位值,我有两个选择:

  • 将8个最重要的位清零,从而模拟环绕
  • 将值限制为2 24 -1,因此它永远不会超越它而不会包裹

答案 2 :(得分:0)

您可以将较大的整数存储在较大的整数中。只需屏蔽你想要的位。

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

或者,您可以在结构成员上定义位域。但是不要尝试将结构写入磁盘并在不同的系统上打开它,因为位域布局不是标准化的

struct {
    long data:24;
};