将 unsigned char 与负数进行比较

标签 c

我想知道 ar[i] != -1 中的第 9 行发生了什么。结果是循环没有停止,但我不确定为什么。

  4 int main()
  5 {
  6     unsigned char ar[] = {1, 2, 3, 4, 5, -1};
  7     int i;
  8
  9     for (i = 0; ar[i] != -1; i++)
 10     {
 11         printf("ar: %u\n", ar[i] );
 12     }
 13     printf("out: %u\n", ar[i] );
 14
 15     return 0;
 16
 17 }

谢谢,

最佳答案

unsigned char ar[] = {1, 2, 3, 4, 5, -1};ar[5] 初始化为 (unsigned char )-1,即 255,因为无符号算术通过回绕来工作。

然后你做 ar[5] != -1整数提升 将左侧从 unsigned char 变为 int 而不更改值。这使得比较 255 != -1 为真,因此循环继续。

一个解决方案是针对 (unsigned char)-1 测试循环条件。或者,您可以使用数组维度而不是标记值。

关于将 unsigned char 与负数进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36770376/

相关文章:

c - 按位将两个或多个数字压缩在一起

c++ - c/c++ dll 在未安装 VS2012 的情况下缺少依赖项...使用它工作正常

c - Linux 中重写 malloc、free 和 calloc 会导致递归

c - 如何在C中定义两个实现?

c - TCP write() 将 char* 打印到自身而不是仅在第一个套接字连接上缓冲,但在第二个连接上工作正常

将矩形转换为圆形

连接两个十六进制地址(PPN 和 VPO),形成一个物理地址

c - 程序可以工作,但输出尾随垃圾值

c - 单独链接哈希表上的段错误

c++ - C/C++ 编译器如何根据运算符的优先级和结合性来分离标记?