簡體   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