zoukankan      html  css  js  c++  java
  • c++ 常量/有符号数和无符号数

    一、宏定义 #define 和常量 const 

    1、

    const关键字

    constconstant的简写,只要一个变量前面用const来修饰,就意味着该变量里的数据可以被访问,不能被修改。也就是说const意味着只读(readonly)。

    const修饰一个变量,一定要给这个变量初始化值,若不初始化,后面就无法初始化。

    1.1

    #include <iostream>
    using namespace std;
    int main()
    {
        const double pi;                      //圆周率的值用pi表示
        pi=3.14159265;
        cout<<"圆周率的近似值是"<<pi<<endl;
        return 0;
    }
    

    报错,没有初始化。只读。

    1.2

    #include <iostream>
    using namespace std;
    int main()
    {
        const double pi=3.141592;            //圆周率的值用pi表示
        cout<<"圆周率的近似值是"<<pi<<endl;
        return 0;
    }
    

    1.3

    const关键字应用

    • 欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了;
    • 对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
    • 在一个函数声明中,const可以修饰形参表明他是一个输入参数,在函数内部不可以改变其值;
    • 对于类的成员函数,有时候必须指定其为const类型,表明其是一个常函数,不能修改类的成员变量;
    • 对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”

    2、

    宏定义 #define 和常量 const 的区别

    类型和安全检查不同

    宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;

    const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查

    编译器处理不同

    宏定义是一个"编译时"概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束于编译时期;

    const常量是一个"运行时"概念,在程序运行使用,类似于一个只读行数据

    存储方式不同

    宏定义是直接替换,不会分配内存,存储与程序的代码段中;

    const常量需要进行内存分配,存储与程序的数据段中

    2.1 

    2.2

    2.3

    二、有符号数和无符号数

    1、基本概念

    在计算机中,可以区分正负的类型,称为有符类型(signed);无正负的类型(只有正值),称为无符号类型 (unsigned)。数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有有符号类型。 字符类型也分为有符和无符类型。 比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。

    1.1 原码

    可以看到 +5 和 -5 的原码除了最高位不一样外,其他都一样。正数最高位为0,负数最高位为1。

    1.2 反码

    反码: 正数的反码为原码,负数的反码是原码符号位外按位取反。

    可以知道: +5的反码是:00000000 00000000 00000000 00000101

                        -5的反码是:11111111 11111111 11111111 11111010

    1.3 补码

    正数补码等于原码,也就是正数原码、反码、补码都一样。

    负数:反码加1称为补码。

    2、例子

    2.1

    #include <iostream>
    using namespace std;
    /* 
     * 这个程序演示了有符号整数和无符号整数之间的差别
    */
    int main()
    {
       short int i;           // 有符号短整数
       short unsigned int j;  // 无符号短整数
       j = 50000;
       i = j;
       cout<<"无符号数:" <<j<<endl;
       cout << "有符号数:"<<i ;
       return 0;
    }
    

    2.2

    上面 j 是无符号数,所以就是显示的 50000。

    接下来我们算下-15536是怎么来的。

    (1)

    50000 在电脑中存的就是上面的二进制数: 1100 0011 0101 0000 。并且是以补码的形式存的。

    当表示无符号数时,补码和原码时一样的,所以原码依旧是:1100 0011 0101 0000。对应的数就是 50000,就是程序中展示的 50000。

    (2)

    当表示有符号数时,补码的最高位1 表示是负数,然后我们通过补码—>反码—>原码,来计算i的值。

    1100 0011 0101 0000 -1=1100 0011 0100 1111  反码(最高位不变,其他位借位减)

                                             1011 1100 1011 0000  原码(最高位代表负数)

    经过如下的变化,就得出了 -15536 的值。

     

      

     

  • 相关阅读:
    博客园转载别人的文章的方法
    CSS属性:定位属性(图文详解)
    深入学习css伪类和伪元素及其用法
    CSS3:RGBA的使用方法
    display和visibility,(height: 0; overflow: hidden;)区别
    css居中div的几种常用方法
    高性能RTMP、RTSP、HLS(m3u8)、HTTPFLV流媒体服务器EasyNVR、EasyDSS、EasyGBS系列产品版本信息中获取的ip是否可以更改?
    EasyDSS高性能RTMP、HLS(m3u8)、HTTPFLV流媒体服务器问题之选定时间段录像进行观看会出现“视频播放等待”字样的问题解析
    RTSP、RTMP、HLS、HTTPFLV,Easy系列的流媒体服务核心产品EasyDSS_kernel在使用hls拉流提示跨域问题是什么原因造成的?
    EasyDSS高性能RTMP、HLS(m3u8)、HTTPFLV、RTSP流媒体服务器解决方案之EasyDSS版本免费更新的方法
  • 原文地址:https://www.cnblogs.com/ruo-li-suo-yi/p/9471825.html
Copyright © 2011-2022 走看看