c - 在 signed int 和 unsigned int 之间转换时是否需要类型转换?

标签 c type-conversion c99 unsigned signed

我尝试将有符号整数分配给无符号整数。

#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. 为什么在这些情况下没有生成警告,即使输入得到 在转换期间修改?
  2. 在这两种情况下都需要类型转换吗?

最佳答案

代码 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/

相关文章:

c - write() 和 read() 如何在 C (<unistd.h>) 中交互?

c - 尝试接受套接字连接,检索并处理消息,然后将此消息写入终端

c - 为什么全局变量总是初始化为 '0' ,而不是局部变量?

c - 为三元运算符内的动态转换生成的代码不正确?

wpf - 将 MessageBoxImage 转换为 ImageSource WPF

ios - Swift 无法将表达式的类型 '()' 转换为 CGRect 类型

c++ - 初始化数组之间的区别

c - 为什么memset在函数上的工作方式不同?

c - header 中的 EXPORT_SYMBOL 导致 "exported twice"错误

c - 如何修复 C99 中的隐式声明错误?