簡體   English   中英

是否未指定在有符號和無符號int之間解析char?

[英]Is resolving char between signed and unsigned int unspecified?

據我了解,根據架構的不同, char可能具有不同的基礎類型。
在隱式強制轉換期間, unsigned char可能會變成和intunsigned int

在此處輸入圖片說明

這是否意味着以下代碼具有未指定的行為?

#include <iostream>

void function(unsigned int){
    std::cout << "unsigned\n";
}
void function(int){
    std::cout << "signed\n";
}

int main() {
    char c;
    function(c);
}

我沒有收到任何編譯器警告。 它將始終解析為“已簽名”嗎?

您的圖對於整數提升是正確的。 但是,在代碼function(c) ,不會發生整數提升。 這實際上是重載解決方案 如果只有一個function則將c 轉換 (不提升)為參數的類型,無論哪種類型。

在重載解析規則中,如果可以通過整數提升使參數與參數匹配,則該函數將被視為比需要整數轉換才能匹配的另一個函數更好的匹配。

參見C ++ 14中的表12(第13.3.3.1.2節的一部分),該表列出了用於過載解析的隱式轉換序列的等級。

因此,您的代碼示例將在具有CHAR_MAX > INT_MAX的系統上調用function(unsigned int)

但是,類型的大小是實現定義的 ,而不是未指定的

char幾乎總是會轉換為int 每當sizeof(int) > sizeof(char)無論char是帶符號的還是無符號的, char都將被提升為int ,就像您說過int可以容納char的整個范圍一樣。

唯一可以獲取unsigned int是當sizeof(char) == sizeof(int) 在這種情況下,如果char是無符號的,則它將被轉換為unsigned int因為int無法容納整個值范圍。

之所以會發生這種情況,是因為該標准僅指示int必須至少具有與char相同的存儲量,因此可能存在某些具有32位字節的系統,並且它們使charint的大小相同。

所以這是實現定義的行為,因為您需要知道兩種類型的實現定義的大小以及char的實現定義的簽名,才能知道會發生什么。

這只是一種C ++功能,稱為“隱式類型轉換/自動類型轉換/強制”。 當您將char傳遞給函數時,char隱式轉換為signed int。 就像代碼“ int a ='C';”一樣 您可以從此處了解有關強制的更多信息: http : //www.learncpp.com/cpp-tutorial/44-implicit-type-conversion-coercion/

在幕后,所有類型都用二進制數表示,因此類型只是解釋的一種方式。 您上面沒有說明這種機制

暫無
暫無

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

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