這個問題源自於以下建議:轉換為 unsigned在呼叫諸如 std::toupper 和 std::tolower 之類的字元操作函式之前, char 是必需的。然而,Bjarne Stroustrup 的程式碼似乎在不進行強制轉換的情況下使用這些函數。
Char 表示
Char、signed char 和 unsigned char 是 C 中不同的類型。 Char 可以表示相當於有符號字元或無符號字元的範圍。在 char 帶符號的系統中,整個字元集都具有非負值。
toupper 函數
根據 C 標準,toupper 接受 int 參數並傳回一個 int 結果。輸入值必須可表示為無符號字元或等於 EOF。如果不是,則行為未定義。
未定義行為
如果普通 char 有符號且傳遞給 toupper 的值為負數,則會發生未定義行為。這是因為隱式轉換為 int 會產生負值。
轉換為 Unsigned Char
將 char 參數轉換為 unsigned char 可確保該值為非負數,避免未定義的行為。儘管 char 和 unsigned char 具有相同的大小,但它們代表不同的值範圍。
實作
這些函數通常使用查找表來實作。超出表範圍的索引可能會導致未定義的行為。如果結果隱式轉換回負值,直接轉換為 unsigned char 並不能避免此問題。
Exception: EOF
C 修改
C 標準僅修改某些C 標準函式,且功能上沒有任何調整
結論
為了避免未定義的行為,有必要在呼叫toupper、tolower 或類似函數之前將char 參數強制轉換為 unsigned char函數,即使 char 是非負符號型別。
以上是在使用'toupper()”、'tolower()”等之前我應該轉換為'unsigned char”嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!