前些天,I came across该构建体:便携式如何将-1转换为无符号类型?
static_cast<size_type>(-1)
在一些示例C++代码,这很可能(取决于其中size_type
是从细节)是等效于以下C:
(size_t)(-1)
据我所知,它的工作原理是-1的二进制补码算法的表示为11111...1
,因为它具有尽可能多的位数,所以这是一种获得最大值的快速方法,即无符号类型size_t
可以容纳。但是,我的理解是,C不保证会使用二进制补码;如果C实现使用补码,那么它将比最大值小1,并且如果它使用符号幅度,它将刚好超过最大值的一半。
是否存在一些我不知道的皱纹,确保这个工作正确无论使用的有符号整数的表示如何? C和C++有什么不同(许多令人惊讶的事情)?
如果你想确定,总是有'std :: numeric_limits :: max()'。 –
UncleBens
2009-11-03 15:23:29
我认为这样的情况是为什么你的语言中有static_cast和reinterpret_cast - static_cast可以给你一些可预测的(并且因此有用),但是在某些平台上可能有较慢的实现,而reinterpret_cast可以取消任何保证。 – Kylotan 2009-11-03 15:46:24
这是恕我直言最好的方式来获得所有的比特数。使用'〜0U'的选项也可以工作(如果你忘记添加'U'并执行'〜0',例如所有的比特位都是0),但是使用'-1'转换为'unsigned'类型它始终独立于类型工作。所以你不必关心使用'ULL'或者首先强制转换为'unsigned short' - 你可以使用'-1'并赋值:)参见http://stackoverflow.com/questions/809227/它是安全的 - 使用 - 将所有位设置为真1 – 2009-11-03 15:50:34