C++中同值无符号与有符号int的内存二进制存储是否存在差异
问题解答
先说结论:没有差异,绝大多数主流C++实现环境下,这两个变量在内存中的二进制序列完全一致。
具体解释:
- C++标准明确要求,
signed int和unsigned int两种类型的数值表示,在二者都能覆盖的非负重叠区间(也就是0到INT_MAX的范围)内必须完全相同。90显然属于这个重叠区间,所以底层存储的二进制没有任何区别。 - 以常见的32位int环境为例,90对应的二进制序列为
00000000 00000000 00000000 01011010,两个变量存储的都是这一串内容,此时符号位为0,不会触发有符号数的特殊表示逻辑。 - 两者的差异仅体现在编译器的运算处理规则上:比如做溢出判断、右移运算、比较运算时,编译器会根据类型的不同走不同的处理逻辑,但这和本次场景下的存储内容无关。
- 只有当赋值的数值超出
signed int的正取值范围(比如大于INT_MAX,或者为负数)时,两种类型的存储二进制才会出现差异。
你给出的示例代码如下:
unsigned int a = 90; signed int b = 90;
内容的提问来源于stack exchange,提问作者Sidharth Tripathi
相关产品推荐
相关产品推荐

