删除结构中的位字段

时间:2009-10-13 05:14:18

标签: c struct bit bit-fields

我有一个问题。我有一个遗留应用程序,它在结构中使用位字段。像这样的东西

struct sample
{
    BYTE            one: 2; 
    BYTE            two     : 1;
    BYTE            three: 5;
} sampletest;

因此three的值只能为MAX 31。

现在我需要增加MAX的{​​{1}}值。我打算删除位字段。它现在将处理更多内存。除此之外,还有什么我需要照顾的吗?它会造成更多其他伤害吗?

4 个答案:

答案 0 :(得分:4)

如果BYTE是无符号类型,则位域将具有明确定义的溢出行为 - 例如:

sampletest.one = -1;

会将sampletest.one设置为3.如果您将其设置为更宽的类型,此行为将会更改。

答案 1 :(得分:3)

您必须仔细查看所有代码,以检查代码是否依赖于包含位字段的此结构。

例如,可能是代码中的某个地方可以读取,操作和写回整个字节(使用强制转换它不是问题) - 如果删除位字段,此代码将分解。所以寻找演员 - 他们是要检查的代码的指标。

答案 2 :(得分:0)

还有一些可能对您很重要的其他事项。或不。

在C语言中,位字段只能声明为'int','signed int'或'unsigned int'(在C99中也是'bool')。不允许任何其他类型(或者如果您的编译器允许它作为扩展,则不可移植)。 (我想知道在你的情况下隐藏'BYTE'背后的东西。)

此外,输入'int'(未明确地'signed'或'unsigned'),当在位域声明中使用时,可能声明有符号或无符号字段,具体取决于实现(和/或其编译设置)

由于您计划将“三个”转换为普通字段(不是位字段),因此检查它是否应该是有符号或无符号的可能是有意义的。

答案 3 :(得分:0)

正如它所声明的那样,假设某个头文件中有#define BYTE unsigned char,如果编译器正在很好地打包字段,那么你的结构只占用一个字节的空间。如果代码只访问结构中的字段,并且从不尝试将结构复制/归零,假设它只是一个字节大小(例如,没有涉及sizeof struct sampletest),那么你会没事的。挖掘代码并检查每个触及它的地方也应该是一件相当简单的事情,以确保,更不用说在完成更改后运行系统的整个测试周期。