我已经看到这种模式在C&C++中使用了很多.
unsigned int flags = -1; // all bits are true
Run Code Online (Sandbox Code Playgroud)
这是一个很好的便携式方法吗?或正在使用0xffffffff或~0更好?
是否有任何c ++标准段落表示使用-1此方法是可移植和正确的方法或正确执行此操作的唯一方法是使用预定义值?
我有一个谈话与我的同事,什么是更好的:使用-1最多的无符号整数,或者使用从价值limits.h还是std::numeric_limits?
我已经告诉我的同事,使用预定义的最大值,limits.h或者std::numeric_limits是这样做的便携和干净的方式,然而,同事反对-1像数字限制一样可移植,而且更多,它还有一个优点:
unsigned short i = -1; // unsigned short max
Run Code Online (Sandbox Code Playgroud)
可以轻松更改为任何其他类型,如
unsigned long i = -1; // unsigned long max
Run Code Online (Sandbox Code Playgroud)
当使用limits.h头文件中的预定义值时,或者std::numeric_limits还需要将其与左侧的类型一起重写.
有没有人知道C标准支持的任何平台,对于这些平台仍然有积极的开发工作,但它们是:
编辑:或者,如果1995年至1998年期间有平台影响了C99决定包括上述内容,但已停止使用,我也会对它们感兴趣.
编辑:C理由有关填充位的说法:
填充位是用户可访问的无符号整数类型.例如,假设一台机器使用一对16位短路(每个都有自己的符号位)来构成一个32位的int,并且当在这个32位int中使用时,忽略较低short的符号位.然后,作为32位有符号整数,在确定32位有符号int的值时会忽略一个填充位(在32位的中间).但是,如果将此32位项目视为32位无符号整数,则该填充位对用户程序可见.C委员会被告知有一台机器以这种方式工作,这就是填充位被添加到C99的一个原因.
脚注44和45提到奇偶校验位可能是填充位.委员会不知道任何具有用户可访问的奇偶校验位的机器在整数内.因此,委员会不知道任何将奇偶校验位视为填充位的机器.
所以另一个问题是,C99提到的那台机器是什么?
编辑:看来,C99正在考虑消除对1的补支持和符号的振幅:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n868.htm HTTP://www.open- std.org/jtc1/sc22/wg14/www/docs/n873.htm(搜索6.2.6.2)
我发现了一些关于这个特定主题的问题,但它们都是关于 C++ 的。
将 -1 分配给 unsigned int 以获得最大值是否安全?
在阅读答案时,这似乎是 C 和 C++ 不同之处之一,这似乎是可能的,或者至少不是不可能的。
问题很简单:
如果我声明一个变量unsigned char/short/int/long var或使用任何其他无符号类型,如固定宽度、最小宽度等,那么是否保证var = -1将设置var为它可以容纳的最大值?该程序是否保证打印“是”?
#include <stdio.h>
#include <limits.h>
int main(void) {
unsigned long var = -1;
printf("%s\n", var == ULONG_MAX ? "Yes" : "No");
}
Run Code Online (Sandbox Code Playgroud)