C语言进阶——有符号与无符号02

在计算机的内部,我们所有的信息都是由二进制数字组成的

有符号数的表实法:

  • 在计算机内部用补码的方式表实有符号数
  • 正数的补码位正数的本身
  • 负数的补码为其绝对值取反然后加一得到

例如-7 他在计算机内部的是1111 1001          是这样得到的 7-》111-》0000 0111-》1111 1000-》1111 1001

无符号整数的表示:

  • 在计算机内部用原码表实无符号整数
  • 无符号整数默认为正数
  • 无符号整数没有符号位

对于固定长度的无符号整数:

  • max+1=min
  • min-1=max

C语言中默认为有符号类型,可以通过unsigned来声明无符号类型的整数,特别注意,只有整数可以声明为无符号整数,浮点数没有无符号类型

代码示例1:

#include <stdio.h>

int main()
{
    char c = -5;
    short s = 6;
    int i = -7;
    
    printf("%d\n", ( (c & 0x80) != 0 ));
    printf("%d\n", ( (s & 0x8000) != 0 ));
    printf("%d\n", ( (i & 0x80000000) != 0 ));
    
    return 0;
}

这里面可以通过与(位运算)来实验最高位是0还是1

代码示例2:

#include <stdio.h>

int main()
{
 
    unsigned int i = 5;
    int j = -10;
    
    if( (i + j) > 0 )
    {
        printf("i + j > 0\n");
    }
    else
    {
        printf("i + j <= 0\n");
    }
    
    return 0;
}

这段代码我们应该仔细分析一下,-10+5应该是个负数,可是为什莫会打印 i+j>0。因为在计算无符号和有符号类型做运算时,计算机会把有符号转化为无符号然后才开始进行计算

示例代码3:

#include <stdio.h>

int main()
{
 
    unsigned int i = 0;
    
    for(i=9; i>=0; i--)
    {
        printf("i = %u\n", i);
    }
    
    return 0;
}

这段代码错误的使用了无符号类型,导致不会退出循环,因为无符号类型你0-1后又是一个很大的正数

 

 

dfsaf

 

 

posted @ 2018-06-18 22:19  清浅...忆回  阅读(304)  评论(0编辑  收藏  举报