前些天,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