c - 整数如何提升为无符号整数

标签 c int unsigned-integer integer-promotion

#include<stdio.h>
void main()
  {    
    int a = -1;
    unsigned int b =15;
      if(b==a)
           printf ("b is equal to a"); 
  }

输出为空。负整数存储为相同正数的 2 的补码。当将整数与 unsigned int 进行比较时,通过将 2 的补码视为 unsigned int 来将整数提升为 unsigned int,此处为 15,但输出为空,即使 2 的补码为 -1是 15

最佳答案

变量ab

int a = -1; /* its a sign ed int, it takes 4 bytes */
unsigned int b =15;/* its a unsigned int */

如下所示

a = -1 => 1111 1111 | 1111 1111 | 1111 1111 | 1111 1111   

b = 15 => 0000 0000 | 0000 0000 | 0000 0000 | 0000 1111
          MSB                                         LSB

现在,当您比较 ab 时,就像

if(b==a) {
    /* some code */
}

在这里,您正在两种不同类型之间进行比较==(asigned类型&b无符号类型)。因此隐式编译器会将sign int转换/提升为unsigned int,然后执行比较==。看这个http://port70.net/~nsz/c/c11/n1570.html#6.3.1.8算术对话规则。

现在 a-1unsigned 等价物是什么?它全部是 4 个字节,即 4294967295。所以现在看起来像

if(15==4294967295) { /*its false */
        /* some code */
}

由于 if 条件为 false,因此您的代码不会打印任何内容。

关于c - 整数如何提升为无符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50862644/

相关文章:

php - 使用 PHP 随机 MySQL 行 - 低系统资源

java - 将 long 转换为 int 得到 0

有符号数和无符号数的比较

c++ - 如何在 C++ 中将 unsigned int(指针)转换为 const char

c - gdb - 使用管道调试

c - 如何获取进程的pid?

c - 不使用 Visual Studio 时出现意外值输出

c - 如何从函数输入二维数组

c - 将可变长度字符串映射到 int

json - 在 Swift 中解析 JSON 字典中的无符号整数