在无符号整数中使用标志号

时间:2014-04-04 03:26:23

标签: c++ c

很多时候人们会通过重新使用他们已经拥有的int变量来组合布尔检查,如果存在或不存在,则检查-1

但是,如果有人想使用无符号整数但仍想使用此方法,并且0实际上除了存在之外还有其他含义,那该怎么办呢。

有没有办法让数据范围为-1到4,294,967,294?

这里显而易见的选择是只使用一个bool来检测你所追求的是什么但是我的理解是bool是一个字节,并且如果你有一个真正可以添加到存储大小一系列结构。这就是为什么我想知道是否有办法获得最有用的数字(postivies),只留下一个数字作为旗帜。

事实上,如果可以做一些事情,比如移动数据类型的数据范围,看起来像将它转换为-10到4,294,967,285这样就可以让你有10个布尔标志而不需要额外的费用(比特)

这里显而易见的hacky方法只是为你的存储添加任何数字,并记得以后再考虑它,但我想保持它更具可读性(我想如果那样的话,我甚至不应该使用 - 1,但是meh)。

2 个答案:

答案 0 :(得分:1)

如果您只想选择一个在变量解释中不存在的值并使用它来表示异常或错误值,为什么不简单地执行此操作?您可以获取此值,将其定义为宏并使用它。例如,如果您确定您的变量永远不会达到最大限制,请输入:

#define MY_FUN_ERROR_VALUE (UINT_MAX)

然后您可以将其用作:

unsigned r = my_function_maybe_returning_error();
if (r == MY_FUN_ERROR_VALUE) {handle error}

当实际没有错误发生时,您还应确保my_function_maybe_returning_error在正常情况下不返回MY_FUN_ERROR_VALUE。为此,您可以使用assert

unsigned my_function_maybe_returning_error() {
    ...
    // branch going to return normal (not error) value r
    assert(r != MY_FUN_ERROR_VALUE);
    return(r);
}

我没有看到任何错误。

答案 1 :(得分:0)

您刚刚询问如何使用0或大于0的值来保存三种状态:0表示大于0且不存在的值。所以不,(根据我认为的归类原则)它是不可能的。

也不应该。重载变量是一种不好的做法,除非你要记住RAM的最后3个字节,你几乎肯定不会这样做。所以是的,请使用另一个具有正确名称和明确目的的变量。