2

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

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

所以three只能有MAX31 的值。

现在我需要MAX增加three. 我打算删除位字段。现在它将处理更多内存。除此之外,我还有什么需要注意的吗?它会造成更多其他伤害吗?

4

4 回答 4

4

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

sampletest.one = -1;

将设置sampletest.one为 3。如果您将其设为更宽的类型,此行为将发生变化。

于 2009-10-13T05:55:54.360 回答
3

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

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

于 2009-10-13T05:16:43.360 回答
0

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

在 C 语言中,位域只能声明为“int”、“signed int”或“unsigned int”(在 C99 中也是“bool”)。不允许任何其他类型(或者不可移植,如果您的编译器允许它作为扩展)。(我想知道在您的情况下,“字节”背后隐藏着什么。)

此外,在位字段声明中使用类型“int”(未明确“签名”或“无符号”)时,可能会声明有符号或无符号字段,具体取决于实现(和/或其编译设置)。

由于您打算将“三”转换为普通字段(不是位归档),因此检查它是否应该被签名或未签名可能是有意义的。

于 2009-10-13T05:59:00.640 回答
0

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

于 2012-01-27T23:15:13.070 回答