![](/img/trans.png)
[英]Are narrowing conversions in non-type template parameters required to be diagnosed?
[英]Narrowing conversions to a larger type (and back again)
我理解,從C ++ 11開始,從int
到unsigned 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);
這些值, j
和n
保證與i
和ll
相同(當然分別)? 是否需要考慮任何可移植性或體系結構(32對64位)問題?
您的兩個示例都是實現定義的。
簽名未簽名的轉換已明確定義,conv.integral / 2:
如果目標類型是無符號的,則結果值是與源整數一致的最小無符號整數(模2 n ,其中n是用於表示無符號類型的位數)。
但是,如果源值可以在目標類型conv.integral / 3中表示,則無符號簽名轉換只能很好地定義:
如果目標類型已簽名,則如果可以在目標類型(和位字段寬度)中表示該值,則該值不會更改; 否則,該值是實現定義的。
對於這兩個示例,無法表示源值(因為兩個無符號值都大於有符號數的最大可能值),因此這些轉換是實現定義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.