我尝试将有符号整数分配给无符号整数。
#include <stdio.h>
int main()
{
int a;
unsigned int b;
scanf("%d", &a);
b = a;
printf("%d %u\n", a, b);
return 0;
}
我希望编译这个会引起警告,我 将 int 值分配给 unsigned int 变量。但我没有得到任何 警告。
$ gcc -std=c99 -Wall -Wextra -pedantic foo.c
$ echo -1 | ./a.out
-1 4294967295
接下来我尝试将 unsigned int 分配给 signed int。
#include <stdio.h>
int main()
{
int a;
unsigned int b;
scanf("%u", &b);
a = b;
printf("%d %u\n", a, b);
return 0;
}
仍然没有警告。
$ gcc -std=c99 -Wall -Wextra -pedantic bar.c
$ echo 4294967295 | ./a.out
-1 4294967295
两个问题:
- 为什么在这些情况下没有生成警告,即使输入得到 在转换期间修改?
- 在这两种情况下都需要类型转换吗?
最佳答案
代码 1:此转换定义明确。如果 int
超出了 unsigned int
的范围,则添加 UINT_MAX + 1
使其在范围内。
既然代码正确正常,应该不会有warning。但是,您可以尝试使用 gcc 开关 -Wconversion
,它会针对某些正确的转换产生警告,尤其是有符号-无符号转换。
代码 2:如果输入大于 INT_MAX
,则此转换是实现定义的。您所使用的实现很可能将其定义为代码 1 中转换的逆。
通常,编译器不会针对在该实现上定义明确的实现定义代码发出警告。同样,您可以使用 -Wconversion
。
转换不是必需的,作为一般原则,应避免转换,因为它们可以隐藏错误消息。
关于c - 在 signed int 和 unsigned int 之间转换时是否需要类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37584511/