我有一个问题。我有一个遗留应用程序,它在结构中使用位字段。像这样的东西
struct sample
{
BYTE one: 2;
BYTE two : 1;
BYTE three: 5;
} sampletest;
因此three
的值只能为MAX
31。
现在我需要增加MAX
的{{1}}值。我打算删除位字段。它现在将处理更多内存。除此之外,还有什么我需要照顾的吗?它会造成更多其他伤害吗?
答案 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
),那么你会没事的。挖掘代码并检查每个触及它的地方也应该是一件相当简单的事情,以确保,更不用说在完成更改后运行系统的整个测试周期。