为什么gcc不会为int和char生成类型不匹配警告?

Igo*_*nko 2 c gcc-warning

为什么在gcc中编译以下代码不会产生任何类型不匹配警告?-1int类型,并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

R S*_*ahu 5

一个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将是一个实现定义的值,但它仍然是下都在标准允许的.