8

我对无符号数字(无符号短整数、整数整数和长整数)的了解,它仅包含正数,但以下简单程序成功地将负数分配给无符号整数:

  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 }

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

4

4 回答 4

22

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

于 2010-05-11T02:59:15.480 回答
8

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

于 2010-05-11T03:03:51.990 回答
6

有符号整数和无符号整数在内存中的大小相同,它们之间的唯一区别是您如何解释它们。有符号值使用二进制补码表示。

如果你把 0xFFFFFFFF 放在一个 4 字节的内存位置,然后问里面的值是什么?好吧,如果我们将其解释为有符号整数,那么它是-1,但如果我们将其解释为无符号整数,则值为 4294967295。无论哪种方式,它都是相同的位模式,不同之处在于您赋予它的含义。

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

于 2010-05-11T23:48:45.307 回答
1

因为存储在 sum 中的 unsigned int 值在printf %i中被视为有符号十进制整数

于 2010-05-11T03:01:59.657 回答