簡體   English   中英

將轉換范圍縮小到更大的類型(並再次返回)

[英]Narrowing conversions to a larger type (and back again)

我理解,從C ++ 11開始,從intunsigned long long轉換被認為是變窄的轉換,因為unsigned long long不能表示任何負值,盡管它足夠大以表示所有位。 我的問題是,如果我強制轉換然后轉換回int ,我保證得到相同的值(具體意味着它既不是未定義也不是實現定義的行為)?

int i = -42;
unsigned long long ull = static_cast<unsigned long long>(i);
int j = static_cast<int>(ull); // is this guaranteed to be -42?

另外,我想知道只更改類型的signed ness的情況:

long long ll = -281474976710655LL;
unsigned long long ull = static_cast<unsigned long long>(ll);
long long n = static_cast<long long>(ull);

這些值, jn保證與ill相同(當然分別)? 是否需要考慮任何可移植性或體系結構(32對64位)問題?

您的兩個示例都是實現定義的。

簽名未簽名的轉換已明確定義,conv.integral / 2:

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

但是,如果源值可以在目標類型conv.integral / 3中表示,則無符號簽名轉換只能很好地定義:

如果目標類型已簽名,則如果可以在目標類型(和位字段寬度)中表示該值,則該值不會更改; 否則,該值是實現定義的。

對於這兩個示例,無法表示源值(因為兩個無符號值都大於有符號數的最大可能值),因此這些轉換是實現定義的。

暫無
暫無

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

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