考慮這個例子:
#include <iostream>
int main()
{
char c = 256;
std::cout << static_cast<int>(c);
}
發出警告:
warning: overflow in conversion from 'int' to 'char' changes value from '256' to ''\000'' [-Woverflow]
但是這個:
#include <iostream>
int main()
{
char c = 255;
std::cout << static_cast<int>(c);
}
不這樣做,但std::cout
在兩種情況下不列印256
和255
,因此它顯示char
無法容納256
和255
,但警告僅在提高char c
的256
?
你可以在這里玩弄它
uj5u.com熱心網友回復:
指定是否char
在您的示例中簽名很重要,但通過您的鏈接,它已簽名。
如果你寫
char c = 256;
256
具有 type int
,因此必須將值存盤在c
轉換中char
。
對于有符號目標型別,如果可以在目標型別中表示,則此類整數轉換會產生相同的值。典型的位大小和有符號字符的表示將是-128
to 127
。
如果源值無法在目標型別中表示,會發生什么取決于幾個因素。
首先,由于 C 20 的二進制補碼是有保證的,這意味著結果值保證是唯一值,這樣 it 和源值2^n
與n
目標型別的位大小(通常8
為char
)取模相等。
在 C 20 之前,它是由實作定義的,在這種情況下會發生什么,但很可能實作只是指定了與 C 20 等效的行為。
因此,警告并不是為了防止未定義的行為,甚至是自 C 20 以來實作定義的行為,而只是為了通知用戶可能的錯誤。
我不能確定為什么 GCC 選擇僅對大于 的值發出警告255
,但我的猜測是這樣做是因為像這樣的陳述句
char c = 255;
如果您將右側解釋為unsigned char
. 上面解釋的轉換規則不會改變轉換前后表示的字符。
然而
char c = 256;
如果右側被解釋為unsigned char
. 所以這是一個錯誤的可能性似乎更高。
但也許我也在猜測錯誤的方向。GCC有一個關于此警告行為的公開錯誤報告-Woverflow
。通過閱讀那里的評論,我不清楚這種行為的最初原因是什么。
例如,Clang 始終對所有超出范圍的值發出警告。因此,警告中似乎有不同的想法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/397871.html
上一篇:獲取聯合的第n個元素的安全方法
下一篇:對容器命名要求的澄清