为什么在gcc中编译以下代码不会产生任何类型不匹配警告?-1是int类型,并f()期望类型为char:
void f(char c) {}
int main(void)
{
f(-1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
即使我们明确指定了类型,也没有警告:
void f(unsigned char c) {}
int main(void)
{
f((signed int)-1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
什么是好奇:如果我们指定超出范围的值,则打印警告:
void f(char c) {}
int main(void)
{
f(65535);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
warning: overflow in implicit constant conversion
gcc版本6.1.1
一个int可以转换为char.int允许char在C和C++中将In 转换为a .
从C11标准:
6.3.1.3有符号和无符号整数
1当具有整数类型的值转换为除了以外的另一个整数类型时
_Bool,如果该值可以由新类型表示,则它将保持不变.2否则,如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.
3否则,新类型已签名且值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号.
从C++ 11标准:
4.7完整转换
1整数类型的prvalue可以转换为另一个整数类型的prvalue.可以将未范围的枚举类型的prvalue转换为整数类型的prvalue.
2如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数...
3如果目标类型已签名,则该值如果可以在目标类型(和位字段宽度)中表示,则不会更改; 否则,该值是实现定义的.
如果char是带符号的类型,则可以轻松保存值-1.因此,行为是可预测的.cin 的整数值为f-1.当unsigned char使用时,值c将是一个实现定义的值,但它仍然是下都在标准允许的.