为什么unsigned int包含负数

Muh*_*edy 8 c printf unsigned

我所知道的unsigned数字(unsigned short,int和longs),它只包含正数,但是下面的简单程序成功地将一个负数分配给unsigned int:

  1 /*
  2  * =====================================================================================
  3  *
  4  *       Filename:  prog4.c
  5  *
  6  * =====================================================================================
  7  */
  8 
  9 #include <stdio.h>
 10 
 11 int main(void){
 12 
 13     int v1 =0, v2=0;
 14     unsigned int sum;
 15     
 16     v1 = 10;
 17     v2 = 20;
 18     
 19     sum = v1 - v2;
 20     
 21     printf("The subtraction of %i from %i is %i \n" , v1, v2, sum);
 22     
 23     return 0;
 24 }
Run Code Online (Sandbox Code Playgroud)

输出是: The subtraction of 10 from 20 is -10

Jam*_*lis 22

%i是有符号整数的格式说明符; 你需要用来%u打印无符号整数.

  • 请记住,因为无符号值只能存储非负值,如果minuend小于减数,则从另一个中减去一个无符号整数将导致下溢,然后您将获得下溢.看看:http://www.topbits.com/integer-overflow.html (2认同)

Dus*_*tin 8

printf,%i格式输出a signed int.使用%u以输出unsigned int.这是开始C编程时的常见问题.为了解决你的问题,结果v1 - v2是-10,但是sumunsigned int,所以真正的答案可能是像4294967286(2 32 - 10).看看你使用时得到了什么The subtraction of %i from %i is %u \n.:)


pro*_*rmr 6

Signed int和unsigned int在内存中的大小相同,它们之间的唯一区别就是你如何解释它们.有符号值使用二进制补码表示.

如果你把0xFFFFFFFF放在一个4字节的内存位置,然后问那里的值是多少?好吧,如果我们把它解释为有符号的int,那么它是-1,但是如果我们把它解释为unsigned int那么值是4294967295.无论哪种方式它都是相同的位模式,差异就是你赋予它的含义.

当你将10 - 20分配给unsigned int时,你计算了一个-10的值(C不进行上溢或下溢检查),这是一个0xFFFFFFF6的位模式,这意味着在一个有符号的int中为-10或在一个无符号的int中为4294967286 INT.如果然后告诉编译器(通过使用%i)打印signed int,那么它将该位模式解释为signed int并打印-10,如果你告诉编译器(通过使用%u)打印unsigned int然后它将该位模式解释为unsigned并打印4294967286.