我有一些位域:
int somefield : 15;
Run Code Online (Sandbox Code Playgroud)
我正在尝试将 int 转换为 15 位(可以是正数或负数)。
有效执行此操作的最佳做法是什么?
我正在尝试将 int 转换为 15 位(可以是正数或负数)。有效地做到这一点的最佳实践是什么?
如果int要转换的值在15位有符号整数范围内,则只需使用以下代码即可。重要的是不要在定义位域时使用intwithout ,因为这是 C 规范中的一个地方,它会产生影响。signed如果没有signed,int位字段可以实现为unsigned。它是实现定义的。
signed int somefield:15;
...
x.somefield = 12345;
int y = x.somefield;
Run Code Online (Sandbox Code Playgroud)
如果int要转换的值可能超出 15 位有符号整数的范围,最好使用字段unsigned来具有可移植一致的定义行为。int当超出范围时,尚不清楚 OP 想要存储什么值。如果需要恢复标志,可能需要一些额外的代码。没有额外的写入开销,也没有额外的读取开销,具体取决于编码需求。
unsigned somefield:15;
...
x.somefield = 123456;
x.somefield = -1;
int y = x.somefield >= 0x4000 ? x.somefield - 0x8000 : x.somefield;
Run Code Online (Sandbox Code Playgroud)
或者,如果要分配的值可能超出位字段范围,请确保分配不会发生。写入方面有额外开销,而读取方面没有额外开销。
signed int somefield 15;
...
if (i >= INT15_MIN && i <= INT15_MAX) x.somefield = i;
else TBD();
int y = x.somefield;
Run Code Online (Sandbox Code Playgroud)