在C中找到特定类型的最大可能位的最简洁方法是什么?
到目前为止,我找到了两种似乎有用的方法:
type value = ~(((type) - 1) >> 1);
和
type value = 1 << ((sizeof(type) * CHAR_BIT) - 1);
我在这里要做的是得到一个值,表示你可以在任何类型中设置的最大位,即char(8位),即:
10000000b
以上两行是做什么的。有没有更好的方法来处理这个?使用上述任何一行来计算这个都有明显的缺点吗?
答案 0 :(得分:2)
您的方法几乎适用于无符号类型。
在第二种情况下,您在转移之前忘记将1
转换为目标类型。
type value = ((type)1) << ((sizeof(type) * CHAR_BIT) - 1);
对于签名类型,它们不可移植:
第一个因为符号表示可能不是两个补码
第二个因为转移到符号位未定义
对于带符号的类型,最简单的应该是对最大值进行位补码,例如
~INT_MAX
“通常”这与INT_MIN
的值相同(对于其他类型也是如此),但在奇怪的架构上,它可能是负0
甚至是陷阱。