zoukankan      html  css  js  c++  java
  • C语言-无符号数与有符号数不为人知的秘密

    一、无符号数与有符号数

    1.计算机中的符号位

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

      -最高位为1,表明这个数为负数

      -最高位为0,表明这个数为正数

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     char c = -5;
     6     short s = 6;
     7     int i = -7;
     8     
     9     printf("%d
    ", ( (c & 0x80) != 0 ));
    10     printf("%d
    ", ( (s & 0x8000) != 0 ));
    11     printf("%d
    ", ( (i & 0x80000000) != 0 ));
    12     
    13     return 0;
    14 }

    2.有符号数的表示法

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

      -正数的补码为正数本身

      -负数的补码为负数的绝对值各位取反加一

    3.无符号数的表示法

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

      -无符号数默认为正数

      -无符号数没有符号位

    对于固定长度的无符号数

      -MAX_VALUE+1 ->MIN_VALUE

      -MIN_VALUE - 1 ->MAX_VALUE

    C语言中默认为有符号数类型

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

    C语言中只有整数类型能够声明unsigned变量

    当有符号数遇到无符号数时:

    实例分析:

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

    有符号数要转换成无符号数

    错误使用unsigned

    实例分析2:

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

    小结:

    有符号数用补码表示

      -正数的符号位为0 

      -负数的符号位为1

    无符号数用原码表示

      -无符号数没有符号位

      -无符号数只有表示正数

    unsigned只能修饰整数类似的变量

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

  • 相关阅读:
    架构漫谈(七):不要空设架构师这个职位,给他实权
    架构漫谈(六):软件架构到底是要解决什么问题?
    架构漫谈(五):什么是软件
    架构漫谈(四):如何做好架构之架构切分
    架构漫谈(三):如何做好架构之识别问题
    [BZOJ 4361] isn(容斥/DP)
    [BZOJ 4767] 两双手(容斥/DP)
    [HNOI2011]卡农(容斥/DP)
    [洛谷] OSU!(期望DP)
    [洛谷] 纯粹容器(结论/期望)
  • 原文地址:https://www.cnblogs.com/lemaden/p/10081407.html
Copyright © 2011-2022 走看看