【发布时间】:2010-12-24 04:54:48
【问题描述】:
在 C 或 C++ 中,据说 size_t(无符号 int 数据类型)可以容纳的最大数量与将 -1 转换为该数据类型相同。例如见Invalid Value for size_t
为什么?
我的意思是,(谈论 32 位整数)AFAIK 最高有效位以有符号数据类型保存符号(即位 0x80000000 形成负数)。那么,1 是 0x00000001.. 0x7FFFFFFFF 是 int 数据类型可以容纳的最大正数。
然后,AFAIK -1 int 的二进制表示应该是 0x80000001(也许我错了)。为什么/如何在将整数转换为无符号时将此二进制值转换为完全不同的值(0xFFFFFFFF)?或者..怎么可能从0xFFFFFFFF中形成二进制-1?
我毫不怀疑在 C 中:((unsigned int)-1) == 0xFFFFFFFF 或 ((int)0xFFFFFFFF) == -1 与 1 + 1 == 2 一样正确,我只是想知道为什么.
【问题讨论】:
-
在 Wikipedia 上阅读“Two的补码”;这是用二进制编码负数的最常用方法。
-
您会注意到,就像无符号数一样,将可能的最高数加 1 会得到可能的最低数。
-
负一的二进制表示必须是加一时产生零的表示。这是
0xFFFFFFFF。