深入理解C语言有符号与无符号类型

数据类型的最高为用于标识数据

最高位为1,表明这个数是负数
最高位为0,表明这个数是正数

  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5     char c = -5;	//	1个字节
  6     short s = 6;	//	2个字节
  7     int i = -7;		//	4个字节
  8     /*扫盲:一个字节 = 8位 */
  9     printf("%d\n", ( (c & 0x80) != 0 ));
 10     printf("%d\n", ( (s & 0x8000) != 0 ));
 11     printf("%d\n", ( (i & 0x80000000) != 0 ));
 12     
 13     return 0;
 14 }

输出结果:

	1
	0
	1

结果分析:
输出1表示负数,0表示正数

有符号数的表示法(补码)

正数的补码为正数本身
负数的补码为 负数的绝对值 各位取反后加1
补码

  1 #include <stdio.h>
  2 int main()
  3 {
  4     unsigned int i = 5;
  5     int j = -10;
  6     printf("i + j = %d\n",i+j);
  7     if( (i + j) > 0 )
  8     {
  9         printf("i + j > 0\n");
 10     }
 11     else
 12     {
 13         printf("i + j <= 0\n");
 14     }
 15     return 0;
 16 }

输出结果:

   i + j = -5
   i + j > 0

结果分析:
-5是正常想到的值,i+j>0不怎么正常
首先前面使用%d输出,无论是int还是unsigned int结果都将是打印出有符号的数。
i+j运算,则是无符号类型与有符号类型进行运算时,有符号类型会转换成无符号类型进行运算,-10的补码,当成一个无符号类型的源码,将是一个很大的正数。结果是大于0.

无符号数的表示法(原码)

无符号数默认为正数
无符号数没有符号位
对于固定长度的无符号数,最大值+1->最小值,最小值-1->最大值

  1 #include <stdio.h>
  2 int main()
  3 {
  4    unsigned int i = 0;
  5     
  6     for(i=9; i>=0; i--)
  7     {
  8         printf("i = %u\n", i);
  9     }
 10     return 0;
 11 }

运行结果:很大的数,一直循环
Ctrl+C强行停止
结果分析,问题出在unsigned上,无符号类型木有负数,负数的补码当成,正数的源码是一个很大的数。

小结

  1. 有符号数用补码表示
    正数的符号位为0
    负数的符号位为1
  2. 无符号数用原码表示
    无符号数木有符号位
    无符号数只用于表示正数
  3. unsigned只能修饰正数类型的变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值