1 有符号与无符号

计算机中的符号位

  • 数据类型的最高位用于标识数据的符号

    • 最高位为1,表明这个数为负数
    • 最高位为0,表明这个数为正数
  • 有符号数的符号位

    #include <stdio.h>
    
    int main()
    {
        int sign = 0;  //符号位
    
        char i = -5;
        short j = 5;
        int k = -1;
    
        sign = i & 0x80;  //sign 不等于 0 : sign = (1011) & (1000 0000) 
        printf("sign = %d
    ",sign);
    
        sign = j & 0x8000;  //sign 等于 0
        printf("sign = %d
    ",sign);
    
        sign = k & 0x80000000;  //sign 不等于 0 : sign = (1111 1111 1111 1111 1111 1111 1111 1111) & (1000 0000 0000 0000 0000 0000 0000 0000) = 1000 0000 0000 0000 0000 0000 0000 0000
        printf("sign = %d
    ",sign);
    
        return 0;
    }
    
    //输出结果
    sign = 128
    sign = 0
    sign = -2147483648##
    

有符号数的表示法

  • 在计算机内部用补码表示有符号数

    • 正数的补码为正数本身

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

    • 8位整数5的补码为:0000 0101

      8位整数-7的补码为:1111 1001

    • 16位整数20的补码为:0000 0000 0001 0100

      16位整数-13的补码为:1111 1111 1111 0011

无符号数的表示法

  • 在计算机内部用原码表示无符号数

    • 无符号数默认为正数
    • 无符号数没有符号位
  • 对于固定长度的无符号数

    • MAX_VALUE+1 -> MIN_VALUE
    • MIN_VALUE-1 -> MAX_VALUE

signed 和 unsigned

  • C语言中变量默认为有符号的类型

  • unsigned 关键字声明变量为无符号类型

    • C语言中,只有整数类型能够声明 unsigned 变量
    #include <stdio.h>
    
    int main()
    {
        int i;  //默认为带符号整型
        signed int j;  //显式声明变量为带符号整型
        unsigned int k;  //声明变量为无符号整型
    
        return 0;
    }
    
  • 当无符号数遇见有符号数

    • 当无符号数与有符号数混合计算时,会将有符号数转换为无符号数后再进行计算,结果为无符号数

    • Demo1

      • 计算 i+j 时,先将 int 型变量 j 转换为 unsigned int
      #include <stdio.h>
      
      int main()
      {
          unsigned int i = 5;
          int j = -10;
          
          if( (i + j) > 0 ){
              printf("i + j > 0
      ");
          }
          else{
              printf("i + j <= 0
      ");
          }
          
          return 0;
      }
      //输出结果:
      i + j > 0
      
    • Demo2

      • 无限循环下去,因为变量 i 的值一直是无符号数,不会出现小于 0 的情况
      #include <stdio.h>
      
      int main()
      {
       
          unsigned char i = 0;
          
          for(i=9; i>=0; i--)
          {
              printf("i = %u
      ", i);
          }
          
          return 0;
      }
      
原文地址:https://www.cnblogs.com/bky-hbq/p/13582412.html