如何在 C 编程语言中以位为单位定义固定大小的数据类型



比如说,对于n = 4,我们需要定义一个数据类型A,使得A的大小变成4位。我知道我们可以通过使用结构来做这件事像下面的代码一样

struct Bit
{
    unsigned int a:4;
} dat;

在这里 dat 将存储最大大小为 4 位的整数,即将存储从 0 到 15,但是如果我们使用 sizeof 运算符,

sizeof(dat);

这将为 4(在 gcc 中)提供值,它对应于 4 个字节,即 32 位,但我需要一些方法来定义大小为 4 位的 dat 变量。

在 C 标准和当前主流计算机中,您不能。在所有常用的硬件上,字大小,CPU可以处理的"本机"数据大小是8位或多个(16,32,64)。从历史上看,计算机也使用其他字大小(如 9 或 12),但我不知道有一台现代机器每个字少于 8 位。

电流C标准描述的最小积分型电流是8位的(u)int8_t。

以您的

struct Bit
{
    unsigned int a:4;
} dat;

标准中没有最小或最大尺寸的要求。但是,CPU 将需要要求。对于一个他来说,它必须是 8 的倍数。

现在如果我们在哪里做

struct Bit
{
    unsigned int a:4;
    unsigned int b:4;
} dat;

编译器可能会将这些字段放入相同的 8 位区域,并在所有操作上添加所需的移位,但这不是严格要求的。编译器也可以将其放入两个不同的单词中。

没有

办法访问少于一个字。

这取决于架构。大多数处理器无法访问小于字节的内存,在您的情况下,32 位可能是最小的内存块。

这里的大小是 32 位,因为您似乎正在使用 32 位机器,并且在每个周期中,读取 32 位(额外的 28 位是操作系统添加的填充位)。

最新更新