我们可以选择为变量保留多少位吗?

时间:2015-10-27 23:22:04

标签: c variables bits

C语言是否允许我们选择为变量保留多少位?例如,如果我们创建整数变量,我们将使用它作为bool(1 = true,0 = false),我们只需要一位。我怎么能只保留一位呢?可能吗?

6 个答案:

答案 0 :(得分:3)

只有当该变量包含在struct中时才有可能。请记住,在这种情况下将完成必要的填充。

例如:

struct Bitfield{
    int Bool : 1;
} bit

bit结构将需要4个字节(假设int的宽度为4个字节),但只有一个位用于存储该值。

最多可以声明32个宽度为1的变量,其结构bit的大小为4个字节。

建议阅读:How is the size of a struct with Bit Fields determined/measured?

答案 1 :(得分:1)

快速回答:不一般,没有。

每种类型都有一个特定的大小,每个声明的对象(变量)都有一个类型,一个对象占用的大小由它的类型决定。每种类型的大小由语言规则决定,在很多情况下由编译器决定。例如,int至少为16位,但可能会更大,具体取决于编译器。

对于bool,假设您的编译器支持它,只声明了_Bool类型的对象(如果您有bool,则声明#include <stdbool.h>。大小可能是一个字节(可能 8位)。

除了位字段之外,不可能有一个大小不是整数字节的对象,并且位字段只能作为结构(或联合)的成员存在。

如果你真的想要一个大小是特定字节数的对象,那么你可以将它定义为unsigned char的数组:

unsigned char obj[42];

如果你想要一个特定大小的整数,那么你可以使用<stdint.h>中声明的类型之一:uint8_t(8位),uint16_t(16位)等

但在大多数情况下,没有必要这样做。只需使用适当的任何类型定义您的变量,让编译器负责确定它们需要的大小。除非您存储或传输需要采用特定格式的二进制数据,否则“大小不重要” - 尤达。

答案 2 :(得分:1)

  

C语言是否允许我们选择为变量保留多少位?

为变量保留的空间取决于其类型。您无法直接指定特定类型的位长度,但每个实现都将提供您可以使用的某些类型。其中一些类型具有实现定义的大小,其中一些是固定的。

  

例如,如果我们创建整数变量,我们将使用它作为bool(1 = true,0 = false),我们只需要一位。我怎么能只保留一位呢?有可能吗?

这是不可能的,因为在大多数架构中有点不可寻址,C要求其类型是可寻址的。

通常,为了存储布尔值而浪费的额外位可以忽略不计。如果您正在处理大量此类布尔值并且浪费的空间不可忽略,则可以始终选择使用位掩码,以便将更多的二进制值打包为更大的整数类型。请记住,如果您选择这样做,您将优化空间并优化速度,因为从较大类型写入或读取隔离位需要在大多数常见架构上进行多次操作。

答案 3 :(得分:1)

要扩展@haccks的答案,如果您有这样的结构:

struct foo {
     int flag1:1;
     int flag2:2;
     int somebits:6;
     int somemorebits:12;
     int evenmorebits:10;
};

foo结构仍然只占用4个字节。

答案 4 :(得分:0)

通过提供变量的类型,您可以对某些进行控制。即,对于整数,您可以在charshortintlong之间进行选择。但标准非常小心,因为它只保证那些大小不按递减顺序排列。它们可能都完全一样,因为它在Cray的C(全32位宽)中都很有名。

答案 5 :(得分:0)

首先,无论如何最小可寻址单位是字节。因此,如果您只使用一位,编译器将使用字节操作。

您可以使用位字段,但可以在结构或联合中定义它们。

考虑到标准头function Test-File { Test-Path "C:\Temp\test.txt" } do { if (-not (Test-File)) { Write-Host "Not here yet..." Start-Sleep -s 3 } } until (Test-File) 包含更精确整数类型的定义。

对于布尔值,您可以使用标准整数类型<stdint.h>