[英]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.