簡體   English   中英

將超出范圍的 integer 分配給有符號字符類型

[英]Assigning an out-of-range integer to a signed char type

signed char a = 128;
假設一個字節是 8 位,這是未定義的嗎?
我所知道的是,將超出范圍的值分配給有符號類型是未定義的,但 Bjarne Stroustrup 在 C++ 編程語言中說,如果我將 integer 255 分配給 8 位字節機器上的 char 符號,其中 char 已簽名結果是-1。

signed char a = 128;
假設一個字節是 8 位,這是未定義的嗎?
我所知道的是,將超出范圍的值分配給有符號類型是未定義的,但是 Bjarne Stroustrup 在 C++ 編程語言中說,如果我將整數 255 分配給 8 位字節機器上的一個字符,其中一個字符是有符號的結果是-1。

默認情況下,在 C 和 C++ 中,上溢/下溢操作的結果是UNDEFINED 如果您溢出/下溢簽名變量類型是 obsecure 會發生什么,這意味着它可以被環繞(許多編譯器都假設它)或者可能轉儲核心或終止程序等。
但是編譯器開發人員通常不嚴格遵守這個定義,並且通常圍繞這些內置類型

這是 C++ 編程語言第 4 版 Bjarne Stroustrup(第 259 頁)中的一部分

void f()
{
    int i = 1;
    while (0 < i) ++i;
    cout << "i has become negative!" << i << '\n';
}
//This will (eventually) try to increase i past the largest integer. What happens then is undefined, but
//typically the value ‘‘wraps around’’ to a negative number (on my machine −2147483648).

這是gnu所說的

此外,將超出范圍的值轉換為帶符號的 integer 類型時,可能會發生溢出。 在這里,標准實現必須定義會發生什么,但這可能包括引發異常。 實際上,在這種情況下,所有已知的實現都支持靜默環繞,因此您不必擔心其他可能性。 塊引用

請查看這篇精彩的文章,了解其他基本程序如何依賴未經授權的簽名溢出。

暫無
暫無

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

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