为什么在 gcc 中编译以下代码不会产生任何类型不匹配警告?-1
属于类型int, and f()
期望类型char:
void f(char c) {}
int main(void)
{
f(-1);
return 0;
}
即使我们明确指定类型,也不会出现警告:
void f(unsigned char c) {}
int main(void)
{
f((signed int)-1);
return 0;
}
奇怪的是:如果我们指定超出范围的值,则会打印警告:
void f(char c) {}
int main(void)
{
f(65535);
return 0;
}
warning: overflow in implicit constant conversion
海湾合作委员会版本 6.1.1
An int
可以转换为char
. In int
允许转换为char
在 C 和 C++ 中。
来自 C11 标准:
6.3.1.3 有符号和无符号整数
1 当整数类型的值转换为除_Bool
,如果该值可以用新类型表示,则它不变。
2 否则,如果新类型是无符号的,则通过在新类型可以表示的最大值上重复加或减 1 来转换该值,直到该值在新类型的范围内。
3 否则,新类型是有符号的,并且值不能在其中表示;结果要么是实现定义的,要么引发实现定义的信号。
来自 C++11 标准:
4.7 积分转换
1 整数类型的纯右值可以转换为另一种整数类型的纯右值。无作用域枚举类型的纯右值可以转换为整数类型的纯右值。
2 如果目标类型是无符号的,则结果值是与源一致的最小无符号整数
整数 ...
3 如果目标类型是带符号的,则如果该值可以用目标类型(和位字段宽度)表示,则该值保持不变;否则,该值是实现定义的。
If char
是有符号类型,它可以轻松保存值-1。因此,行为是可以预测的。的积分值c
in f
将为-1。什么时候unsigned char
被使用时,其值c
将是一个实现定义的值,但两个标准仍然允许它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)