如何将整数提升为无符号整数

时间:2018-06-14 17:06:02

标签: 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的补码。当一个整数与无符号整数比较时,整数被提升为无符号整数,将2的补码视为无符号整数,此处为15,但输出为空,尽管2的补码为-1是15

2 个答案:

答案 0 :(得分:2)

变量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 */
}

您要在两种不同类型之间进行比较==a属于signed类型&amp; b属于unsigned类型。所以隐式编译器会将sign int转换/推广到unsigned int &amp;然后它将执行比较==。有关算术对话规则,请参阅此http://port70.net/~nsz/c/c11/n1570.html#6.3.1.8

现在等同于unsigneda的{​​{1}}是多少?其全部-1为4字节,即one's。所以现在它看起来像

4294967295

由于if(15==4294967295) { /*its false */ /* some code */ } 条件为false,因此您的代码不会打印任何内容。

答案 1 :(得分:0)

如果您将变量b更改为

unsigned int b = 4294967295;

(这假设int存储为32位)

将运行print语句。请参阅https://stackoverflow.com/a/2084968/7529976