专栏首页YZh学习记录C++第二章 变量与基本类型
原创

C++第二章 变量与基本类型

1. 位与字节

位:计算机的基本存储单位是位(bit)。

位可以简单的看作开关。其中,0表示关,1表示开。

8位的内存块可以设置为256种不同组合。(2的8次方)

8位单元的表示范围为0-255, -128-127

字节:(byte)

字节是指8位的内存单元。字节是计算机内存量的度量单位。

1字节 = 8位

1KB = 1024字节

1MB = 1024KB

2. 基本内置类型

c++中的类型检查发生在编译阶段,因此编译器必须知道程序中每一个变量所对应的类型。

创建变量或者常量时,指定对应的数据类型,以便分配内存。

C++基本内置类型图

Tips1:如何选择类型 关于如何选择类型的一些准则

  • 知道数据不可能为负的情况,用unsigned。
  • 若int范围不够用,跳过long(long一般和int有一样的尺寸),直接选用long long。
  • 在算数表达式中不要使用char或者bool,只有在存放字符或布尔值时才使用它们。因为不同机器对char是有符号还是无符号的解释可能不一样。若有需要,请使用signed char或者unsigned char。
  • 浮点数直接用double,没必要用float(float精度不够,而且双精度浮点数和单精度浮点数的计算代价相差无几)

2.1 基本类型注意事项:

整型:64位编译系统,一般占内存如下所示:

char 1个字节

short (int) 2个字节

int 4个字节

long (int) 4个字节

long long (int) 8个字节

超出内存时,减去边界值,重新计算。

此外,整型分为有符号和无符号类型。无符号类型可以增大变量能够存储的最大值。

浮点型:

主要用于表示小数,两者的区别在于表示小数的有效数字不同。

float 单精度 4个字节

double 双精度 8个字节

float的定义

float f = 0.1f;

科学计数法表示小数:

 float f1 = 3e2;   //3 * 10^2
 float f2 = 3e-3;   //3 * 10^(-3)

float 与double的比较

#include <iostream>
using namespace std;
int main()
{
    double a = 0.0001;
    float b = 0.0001;
    if(a == b)
    {
        cout << "a = b" << endl;
    }
    else if(a > b)
    {
        cout << "a > b" << endl;
    }

    else if(a < b)
    {
        cout << "a < b" << endl;
    }
    return 0;
}

后缀表示类型:

l L 后缀表示该整数为long类型

u U后缀表示为unsigned int 类型

3. 类型转换

4. 取模与取余的区别

取模运算(“Modulo Operation”)和取余运算(“Remainder Operation”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。取模主要是用于计算机术语中。取余则更多是数学概念。

对于整型数a,b来说,取模运算或者求余运算的方法都是:

       1.求整数商: c = a/b;

       2.计算模或者余数: r = a - c*b. 求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。

       例如:计算-7 Mod 4

       那么:a = -7;b = 4;

       第一步:求整数商c,如进行求模运算c = -2(向负无穷方向舍入),求余c = -1(向0方向舍入);

       第二步:计算模和余数的公式相同,但因c的值不同,求模时r = 1,求余时r = -3。

       归纳:当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。

       当符号不一致时,结果不一样。求模运算结果的符号和b一致,求余运算结果的符号和a一致。

       另外各个环境下%运算符的含义不同,比如c/c++,java 为取余,而python则为取模。

  通常,取模运算也叫取余运算,它们返回结果都是余数.

rem(取余)和mod(取模)唯一的区别在于: 当x和y的正负号一样的时候,两个函数结果是等同的;当x和y的符号不同时,rem函数结果的符号和x的一样,而mod和y一样。

取模运算的简便理解

 取模运算时,对于负数,应该加上被除数的整数倍,使结果大于或等于0之后,再进行运算.

  也就是:(-1)%256 = (-1+256)%256=255%256=255

4. 变量定义:

5. 变量声明与定义的关系:

6. 作用域:

7. 复合类型

空指针:

最好使用nullptr, 避免使用NULL

7.1 指针与引用的区别:

指针

指针本身就是一个对象,可以赋值,可以拷贝.在指针的生命周期内可以先后指向几个不同的对象.

指针无需在定义时赋值.

int *p  p是指向int类型的指针

引用:

引用是为对象起了另外一个名字.引用在定义时,程序将引用和它的初始化对象绑定在一起.

因此引用无法重新绑定其他对象,引用必须初始化.

int a = 2;
int *p = &a;//p中存放的a的地址, p是指向变量a的指针
//解引用就会获取指向的对象
*p = 3;  //即a的值变成3
解引用仅适用于那些确实指向了某个对象的有效指针.

7.2 const对象必须初始化

指针本身是一个对象,指针又可以指向一个对象.

指针本身是一个常量称为顶层(top-lever const).

顶层const可以表示任意的对象是常量,适用于任意数据类型.如算数类型,类,指针

指针所指向的对象是一个常量称为底层(low-lever const)

底层const与指针和引用等复合类型的基本类型有关.

const int a = 1;         //顶层
int *const b = &a;       //顶层
const int *c = &a;       //底层

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 相机标定1:坐标系关系

    于是,从世界坐标系到相机坐标系,涉及到旋转和平移(其实所有的运动也可以用旋转矩阵和平移向量来描述)。绕着不同的坐标轴旋转不同的角度,得到相应的旋转矩阵,如下图所...

    yzh
  • valgrind测试报告分析

    valgrind输出结果会报告5种内存泄露,"definitely lost", "indirectly lost", "possibly lost", "st...

    yzh
  • CAM 系列论文阅读总结

    CAM全称Class Activation Mapping,既类别激活映射图,也被称为类别热力图。

    yzh
  • 范锦:腾讯云人脸识别系统在传统行业的应用与落地

    4月13日结束的计算机视觉沙龙圆满落幕。本期沙龙从构建图像识别系统的方法切入,讲述腾讯云人脸识别、文字识别、人脸核身等技术能力原理与行业应用,为各位开发者带来了...

    云加社区技术沙龙
  • LeetCode Weekly Contest 40解题思路

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1147447
  • Java.lang.OutOfMemoryError处理

    听着music睡
  • Go 语法速览与实践清单(V0.5)

    Go CheatSheet 是对于 Go 学习/实践过程中的语法与技巧进行盘点,其属于 Awesome CheatSheet 系列,致力于提升学习速度与研发效能...

    王下邀月熊
  • 【 Gym - 101138K 】 The World of Trains (DP)

    BUPT2017 wintertraining(15) #4E Gym - 101138K

    饶文津
  • 实例详解linux文本三剑客--sed

    章鱼喵
  • 自动曝光修复算法 附完整C代码

    AF自动对焦(Automatic Focus) 自动对焦即调节摄像头焦距自动得到清晰的图像的过程

    cpuimage

扫码关注云+社区

领取腾讯云代金券