【问题标题】:Why unsigned int contained negative number为什么 unsigned int 包含负数
【发布时间】:2011-02-17 23:09:38
【问题描述】:

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

  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

【问题讨论】:

  • 另外,您的信息具有误导性。它应该说“从 10 中减去 20 是...”,这就是您正在计算的内容。
  • 我不是在为这样的问题寻求解决方案,我想了解这个想法。

标签: c printf unsigned


【解决方案1】:

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

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

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

【讨论】:

  • 所以,我解释位模式的方式控制着内存中的值。谢谢。
  • 嗯,“内存中”的值总是一样的。它们是相同的位。改变的是它的输出方式。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 请记住,因为无符号值只能存储非负值,如果被减数小于减数,则从另一个无符号整数中减去一个无符号整数将导致下溢,那么您将得到下溢。看一看:topbits.com/integer-overflow.html
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 2016-02-26
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 2018-08-25
      相关资源
      最近更新 更多