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

前端之家收集整理的这篇文章主要介绍了c – 使用0xFFFFFFFF是一种可靠的方法来设置32位类型的所有位吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个代码Windows SDK编译:
UINT cFiles = DragQueryFileW(hDrop,0xFFFFFFFF,NULL,0);

DragQueryFileW()具有此签名:

UINT DragQueryFileW(HDROP,UINT,LPWSTR,UINT );

和UINT在SDK头文件中的某处定义如下:

typedef unsigned int UINT;

对于int肯定是32位的平台.像往常一样,像UINT这样的类型意味着具有与系统位数无关的固定宽度,因此如果必须在其他平台上重新编译相同的代码,那么DragQueryFileW()以某种方式重新实现,还会有一个相应的typedef来生成UINT映射到合适的32位无符号类型.

现在有一个静态分析工具,它查看0xFFFFFFFF常量,并抱怨它是一个不可移植的幻数和one should use -1 instead.当然-1是好的和可移植的我不知道如何使用0xFFFFFFFF常量可能是一个问题,因为即使当移植类型仍然是32位,常量将是正常的.

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

解决方法

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

如:

UINT foo = (UINT)-1;

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

uint32_t foo = (uint32_t)-1;

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

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

猜你在找的C&C++相关文章