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

标签 c

假设n = 4,我们需要定义一个数据类型A,使得A的大小变为4位。我知道我们可以通过使用结构来做到这一点 就像下面的代码一样

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

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

sizeof(dat);

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

最佳答案

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

当前 C 标准描述的最小整数类型是 8 位的 (u)int8_t。

以你的例子

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

标准中没有对此最小或最大尺寸的要求。然而,CPU 需要一些要求。对于一个 uint 来说,它得到的值必须是 8 的倍数。

现在如果我们在做什么

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

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

无法访问少于一个单词的内容。

关于c - 如何在 C 编程语言中定义固定大小的数据类型(以位为单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37593015/

相关文章:

c - 如何从c中的图像获取流

c++ - 如何用HDF5源代码编译c程序?

c - X 子结构重定向弄乱了工具/菜单栏

objective-c - OSC 库在 iOS6 上使用 ARC

c - 表达式必须具有结构或 union 类型

无法理解C中的尝试

c - 与 FIFO 通信的两个程序使用 for 循环但不使用 while 循环

c - 用户在一行中键入一个单词和一个数字。将它们读入提供的变量中。然后打印

C - 检查指针是否为 NULL 时出现段错误

c - 系统方法我可以停止状态码吗?