我对无符号数字(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 }
输出是:
The subtraction of 10 from 20 is -10
答案 0 :(得分:22)
%i
是签名整数的格式说明符;您需要使用%u
来打印无符号整数。
答案 1 :(得分:8)
使用printf
,%i
格式输出signed int
。使用%u
输出unsigned int
。这是开始C编程时的常见问题。为了解决您的问题,v1 - v2
的结果是-10,但sum
是unsigned int
,所以真正的答案可能是4294967286(2 32 - 10)。查看使用The subtraction of %i from %i is %u \n
时获得的内容。 :)
答案 2 :(得分:6)
Signed int和unsigned int在内存中的大小相同,它们之间的唯一区别就是你如何解释它们。有符号值使用二进制补码表示。
如果你把0xFFFFFFFF放在4字节的内存位置,然后问那里的值是多少?好吧,如果我们把它解释为有符号的int,那么它是-1,但是如果我们把它解释为unsigned int那么值是4294967295.无论哪种方式它都是相同的位模式,差异就是你赋予它的含义。
当你将10 - 20分配给unsigned int时,你计算了一个-10的值(C不进行上溢或下溢检查),这是一个0xFFFFFFF6的位模式,这意味着有符号的int中的-10或4294967286在unsigned int中。如果然后告诉编译器(通过使用%i)打印signed int,那么它将该位模式解释为signed int并打印-10,如果你告诉编译器(通过使用%u)打印unsigned int然后它将该位模式解释为无符号并打印4294967286。
答案 3 :(得分:1)
因为存储在sum中的unsigned int值被视为printf %i
中的带符号十进制整数