使用0xFFFFFFFF是一种可靠的方法来设置32位类型的所有位吗?

sha*_*oth 6 c++ binary portability types bit-fields

这个代码用Windows SDK编译:

UINT cFiles = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0);
Run Code Online (Sandbox Code Playgroud)

DragQueryFileW()这个签名在哪里:

UINT DragQueryFileW(HDROP, UINT, LPWSTR, UINT );
Run Code Online (Sandbox Code Playgroud)

UINT在SDK标题中的某处定义,如下所示:

typedef unsigned int UINT;
Run Code Online (Sandbox Code Playgroud)

对于平台int肯定是32位.像往常一样,类型UINT的意思是固定宽度独立于系统位度,所以如果必须在其他平台上重新编译相同的代码,那么在DragQueryFileW()某处重新实现的地方也会有相应的地图typedef,这将使UINT地图成为合适的32-位无符号类型.

现在有一个静态分析工具,着眼于0xFFFFFFFF不断并抱怨,这是一个不可移植的幻数和应使用-1来代替.虽然当然-1是好的和便携式的,但我不知道如何使用0xFFFFFFFF常量可能是一个问题,因为即使移植类型仍然是32位并且常量将是好的.

在这种情况下,是否使用0xFFFFFFFF而不是-1设置所有位安全和可移植?

Dar*_*ust 12

填充所有位(无论类型大小)的可移植方式实际上是:

type variable = (type)-1;
Run Code Online (Sandbox Code Playgroud)

如:

UINT foo = (UINT)-1;
Run Code Online (Sandbox Code Playgroud)

使用C99类型名称或更便携:

uint32_t foo = (uint32_t)-1;
Run Code Online (Sandbox Code Playgroud)

C标准保证分配-1设置所有位.

现在,如果你可以保证你的变量是无符号的 32位,那么0xFFFFFFFF当然使用也没问题.但我仍然会选择-1变体.


jco*_*ctx 2

0xffffffff 无疑是将所有位设置为 32 位中的一位的可靠方法。但我不会依赖 UINT 总是 32 位。

为了让它不那么“神奇”,你也可以写它: (1 << 32) - 1