无符号格式化输出的区别%d,%u?

  • Post author:
  • Post category:其他




上来就是重点

unsigned int uint;
int i = -1;
uint = i;
printf("%x %u %d\n", uint, uint, uint);
printf("%x %u %d\n", i, i, i);
//输出
	ffffffff 4294967295 -1
	ffffffff 4294967295 -1
/*
	因为 根据打印格式打印的
	%d 有符号32位整数
	%u 无符号32位整数
	%lld 有符号64位整数
*/
uint = 0xffffffff;
i = uint;
printf("%x %d\n", uint, i);
//输出ffffffff -1

int j = -1;
printf("%x\n", (~j));
//输出0

int k = 1;
printf("%x\n", (~k);
//输出0xfffffffe

char c = 1;
printf("%d\n", (~c));
//输出-2

因为: 
 char c = 1;
printf("%x\n", c); //1
printf("%x\n", (~c)); //fffffffe
printf("%d\n", (~c));//-2

如果以上例子看的没问题,那你就不用往下看了!哈哈~~



什么是无符号数 ?

无符号数(unsigned number) 是相对于有符号数而言的,

指的是整个机器字长的全部二进制位均表示数值位,相当于数的绝对值。

如: 32位操作系统中

(普及概念:

8位的CPU,一次只能处理一个8位的“数据”或者一个8位的”指令”。比如’00001101’。

32位CPU一次能处理32位的数据或者一个32位的指令。

如 00000001 00000011 00000111 00001111)

unsigned int iMinNum = 0;

unsigned int iMaxNum = 0xffffffff;

printf(“iMinNum = %u, iMaxNum = %u\n”, iMinNum, iMaxNum);

结果:

–》iMinNum = 0, iMaxNum = 4294967295

其中,无符号数32位的取值范围是: 0~4294967295

注意:%u 无符号32位整数



什么是有符号数 ?

有符号数(signed number) 和无符号数基本相同,不同的是:一般用最高有效位(MSB)来表示数的符号,正数用0表示,负数用1表示。

如: 32位操作系统中

int iMinNum = 0x80000000; //1000 0000 0000 0000 0000 0000 0000 0000 
int iMaxNum = 0x7fffffff; //0111 1111 1111 1111 1111 1111 1111 1111
printf("iMinNum = %d, iMaxNum = %d\n", iMinNum, iMaxNum);
结果:
iMinNum = -2147483648, iMaxNum = 2147483647

其中,有符号数32位的取值范围是: -2147483648~2147483647

二进制表示:

最小值: 1000 0000 0000 0000 0000 0000 0000 0000

最大值: 0111 1111 1111 1111 1111 1111 1111 1111

因为: 在有符号数中,最高位所代表的值是- 2^ 31 ,而不是-1

注意:%d 有符号32位整数



有符号数和无符号数的区别

有符号数和无符号数的区别:

在32位编译器中,

有符号数的二进制位最高位表示-2^ 31,而无符号数的二进制位最高位表示的是2^31


无论它是有符号数还是无符号数,它的二进制表示肯定都是唯一的

(不可能在有符号形式下有一种表示,在无符号形式下也有一种表示)



版权声明:本文为lluojian原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。