繁体   English   中英

有符号整数未转换为无符号整数

[英]Signed int not being converted into unsigned int

我正在阅读 Lippman 和 Lajoie 所著的 C++ Primer 一书。 在第 65 页他们说:如果我们在算术表达式中同时使用无符号和 int 值,则 int 值通常会转换为无符号。

如果我尝试他们的示例,事情会按预期工作,即:

unsigned u = 10;
int i = -42;
std::cout << u + i << std::endl; // if 32-bit ints, prints 4294967264

但是,如果我将 i 更改为 -10,我得到的结果是 0 而不是预期的 4294967296,具有 32 位整数:

unsigned u = 10;
int i = -10;
std::cout << u + i << std::endl; // prins 0 instead of 4294967296. Why?

这个表达式不应该打印10 + (-10 mod 2^32)吗?

unsigned intint都在内存中占用 32 位,让我们考虑一下它们的位表示:

unsigned int u = 10;
00000000000000000000000000001010

int i = -42;
11111111111111111111111111010110

u + i:
11111111111111111111111111100000

如果我们将11111111111111111111111111100000视为有符号数( int ),那么它是 -32: 在此处输入图像描述

如果我们把它当作一个无符号数( unsigned ),那么它就是 4294967264: 在此处输入图像描述

区别在于最高位,无论是代表-2^31,还是+2^31。


现在让我们看一下(10u) + (-10)

   unsigned int u = 10;
   00000000000000000000000000001010

   int i = -10;
   11111111111111111111111111110110

   u + i:
(1)00000000000000000000000000000000

由于u + i将超过 32 位限制,因此最高位1将被丢弃。 由于剩余的 32 位全为零,因此结果将为 0。同样,如果i = -9 ,则结果将为 1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM