簡體   English   中英

C ++有符號整數轉換為無符號位數更多

[英]C++ signed integer conversion to unsigned with more bits

我想知道從較小的有符號整數到較大的無符號整數的類型轉換。 看來,編譯器首先將有符號整數轉換為與目標大小相同的有符號整數,然后再轉換為無符號整數。

關於以下C ++代碼:

#include <assert.h>
#include <iostream>

typedef int sint;
typedef unsigned __int64 luint;

int main(int, char**) {
   assert(sizeof(luint) > sizeof(sint));
   sint i = -10;
   luint j = i;
   std::cout << std::hex << j;
}

在Visual C ++下,產生: fffffffffffffff6

這就是我喜歡的。 我可以確定所有編譯器都會以這種方式運行嗎? 如果將有符號整數先轉換為無符號整數,然后再轉換為新的大小,則結果將為fffffff6

有符號到無符號的轉換使用2 n運算。 從C ++ 11標准的4.7積分轉換[conv.integral] (第4.7 / 2節):

如果目標類型是無符號的,則結果值是與源整數一致的最小無符號整數(取模2 n ,其中n是用於表示無符號類型的位數)。

所以j取值2 64 - 10,這是0xfffffffffffffff6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM