据我了解,char
根据架构可能会有不同的基础类型
在隐式投射期间,unsigned char
可能会成为int
或unsigned int
。
这是否意味着以下代码具有未指定的行为?
#include <iostream>
void function(unsigned int){
std::cout << "unsigned\n";
}
void function(int){
std::cout << "signed\n";
}
int main() {
char c;
function(c);
}
我没有得到任何编译器警告。它会永远解决“签名”吗?
答案 0 :(得分:3)
您的图表适用于整数提升的情况。但是,在代码function(c)
中,不会发生整数提升。这实际上是重载决议。如果只有一个function
,则c
转换(未提升)为参数类型,无论哪个。
在重载决策的规则中,如果参数可以通过整数提升来匹配参数,那么该函数将被认为是比需要整数转换匹配的另一个函数更好的匹配
参见C ++ 14(第13.3.3.1.2节的一部分)中的表12,其中列出了重载解析的隐式转换序列的等级。
因此,您的代码示例会在function(unsigned int)
的系统上调用CHAR_MAX > INT_MAX
。
但是类型的大小是实现定义,而不是未指定。
答案 1 :(得分:1)
char
几乎总是会转换为int
。每当sizeof(int) > sizeof(char)
然后将char
提升为int
时,无论其是否已签名或未签名,就像您所说int
可以保留char
的整个范围一样}。
unsigned int
的唯一时间是sizeof(char) == sizeof(int)
。在这种情况下,如果char
未签名,则会转换为unsigned int
,因为int
无法保留整个值范围。
这可能发生,因为标准只规定int
必须至少具有与char
一样多的存储空间,因此可能有一些系统具有32位字节并且它们会生成char
}和int
大小相同。
所以这是实现定义行为,因为您需要知道两种类型的实现定义大小以及char
的实现定义签名,以了解将会发生什么。
答案 2 :(得分:-1)
这只是一种C ++特性,称为“隐式类型转换/自动类型转换/强制”。当您将char传递给函数时,char被隐式转换为signed int。就像代码“int a ='C';”您可以从此处了解有关强制的更多信息:http://www.learncpp.com/cpp-tutorial/44-implicit-type-conversion-coercion/
在幕后,所有类型都表示为二进制数,因此类型只是解释编译的一种方式。你上面没有这样的机制