• 【C++ Primer Plus】第3章 处理数据


    【信息存储】

    程序将找到一块能够存储整数的内存,将该内存单元标记为braincount,并将5复制到该内存单元中;然后,您可在程序中使用braincount来访问该内存单元。

    1. int braincount{5};
    2. int braincount = {5};
    3. int braincount = 5;        //存储一个整数,并使用名称braincount来表示该整数的值

    【变量命名规则】

    1. 在名称中只能使用字母字符、数字和下划线(_)。
    2. 名称的第一个字符不能是数字。
    3. 区分大写字符与小写字符。
    4. 不能将C++关键字用作名称。
    5. 以两个下划线或下划线和大写字母打头的名称被保留给实现(编译器及其使用的资源)使用。 以一个下划线开头的名称被保留给实现,用作全局标识符。
    6. C++对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台命名方案有长度限制。

    【整型变量的长度】

    1. short至少16位;
    2. int至少与short一样长;
    3. long至少32位,且至少与int一样长;
    4. long long至少64位,且至少与long一样长。

    可以使用sizeof()函数查看各数据类型在内存中占多少个字节

    1. #include
    2. #include //定义了符号常量来表示类型的限制
    3. int main(void)
    4. {
    5. int n_int = INT_MAX;
    6. short n_short = SHRT_MAX;
    7. long n_long = LONG_MAX;
    8. long long n_llong = LLONG_MAX;
    9. //sizeof不是函数,是运算符。sizeof查看类型所占用的内存大小必须加括号,查看变量可以不加括号。
    10. cout << "int is " << sizeof(int) << " bytes." << endl;
    11. cout << "Maximum values: " << n_int << endl;
    12. cout << "short is " << sizeof n_short << " bytes." << endl;
    13. cout << "Maximum values: " << n_short << endl;
    14. cout << "long is " << sizeof(long) << " bytes." << endl;
    15. cout << "Maximum values: " << n_long << endl;
    16. cout << "long long is " << sizeof n_llong << " bytes." << endl;
    17. cout << "Maximum values: " << n_llong << endl;
    18. return 0;
    19. }

    输出:

    整型从最小到最大依次是:

    bool、 char、 signed char、unsigned char、 short、 unsigned short、 int、 unsigned int、 long、 unsigned long以及C++11新增的long long和unsigned long long。 

    为什么C++有多种整型?

    有多种整型类型,可以根据特定需求选择最适合的类型。 例如,可以使用short来存储空格,使用long来确保存储容量,也可以寻找可提高特定计算的速度的类型。

    【整型溢出】

    1. int main(void)
    2. {
    3. short sam = SHRT_MAX;
    4. unsigned short sue = sam;
    5. cout << "short sam = SHRT_MAX;\t unsigned short sue = sam;" << endl;
    6. cout << "sam = " << sam << ",\t\t sue = " << sue << endl;
    7. sam = sam+1; //溢出
    8. sue = sue+1;
    9. cout << "sam +1 = " << sam << ",\t sue + 1 = " << sue << endl;
    10. return 0;
    11. }

    输出:

    原因:

    该程序将一个short变量(sam)和一个unsigned short变量(sue)分别设置为最大的short值,在我们的系统上,是32767。然后,将这些变量的值都加1。这对于sue来说没有什么问题,因为新值仍比无符号整数的最大值小得多;但sam的值从32767变成了-32768! 同样,对于sam,将其设置为0并减去1, 也不会有问题; 但对于无符号变量sue,将其设置为0并减去后,它变成了65535。可以看出,这些整型变量的行为就像里程表。如果超越了限制,其值将为范围另一端的取值(参见图3.1)。C++确保了无符号类型的这种行为; 但C++并不保证符号整型超越限制(上溢和下溢)时不出错,而这正是当前实现中最为常见的行为。

     【cout输出同一数据的不同进制表达形式】

    1. #include
    2. using namespace std;
    3. int main(void)
    4. {
    5. int a;
    6. cout << "请输入一个整数 a = ";
    7. cin >> a;
    8. cout << oct << "a 的8进制:" << a << endl;
    9. cout << hex << "a 的16进制:" << a << endl;
    10. cout << dec << "a 的10进制:" << a << endl; //默认也是十进制输出
    11. return 0;
    12. }

    输出:

    【char字符在内存中的存储和读取】 

    1. #include
    2. using namespace std;
    3. int main(void)
    4. {
    5. char ch = 'M'; //在内存中ch是以ASCII码值77存储
    6. int i = ch; //并没有类型不匹配,把ch内存中的77读取出来赋给整型
    7. //cout发现ch是char类型,就把内存中的77变为对应的字符显示出来
    8. cout << "The ASCII code for " << ch << " is " << i << endl;
    9. ch = ch+1;
    10. i = ch;
    11. cout << "ch + 1 后:" << endl;
    12. cout << "The ASCII code for " << ch << " is " << i << endl;
    13. cout.put('M'); //通过类对象cout来使用函数put( )
    14. cout << endl;
    15. cout << 'M' << endl;
    16. return 0;
    17. }

    输出:

    如何使用C++来找出编码88表示的字符?

    1. char c = 88;
    2. cout << c << endl; // char type prints as character
    3. cout.put(char(88)); // put() prints char as character
    4. cout << char(88) << endl; // new-style type cast value to char
    5. cout << (char)88 << endl; // old-style type cast value to char

    【浮点数的表示】

            1、小数点的形式;例如:float a=12.345;
            2、E表示法;例如:float a=1.2e-10;

    C和C++对于有效位数的要求是,float至少32位,double至少48位,且不少于float,long double至少和double一样多。这三种类型的有效位数可以一样多。然而,通常,float为32位,double为64位,long double为80、96或128位。另外,这3种类型的指数范围至少是-37到37。

    常量为float类型,请使用f或F后缀。对于long double类型,可使用l或L后缀(由于l看起来像数字1,因此L是更好的选择) 。

    1. auto b = 8.25f / 2.5; //2.5默认double,则b也是double类型。
    2. auto a = 12.345678L; //a默认为long double类型
    3. cout << a << endl; //输出为12.3456,因为浮点数在系统中只显示了6位有效位

     【double和float精度之间的差异】 

    1. #include
    2. using namespace std;
    3. int main(void)
    4. {
    5. cout.setf(ios_base::fixed, ios_base::floatfield); //浮点数显示到小数点后六位
    6. float tub = 10.0 / 3.0;
    7. const float million = 1.0e6; //定义一个float类型的[常量]
    8. cout << "tub = " << tub << endl;
    9. cout << "A million tubs = " << tub * million << endl;
    10. double mint = 10.0 / 3.0;
    11. cout << "mint = " << mint << endl;
    12. cout << "A million mint = " << mint * million << endl;
    13. return 0;
    14. }

    输出:

    原因:

    tub和mint都被初始化为10.0/3.0—3.333333333333333333……由于cout打印6位小数, 因此tub和mint都是精确的。 但当程序将每个数乘以一百万后, tub在第7个3之后就与正确的值有了误差。 tub在7位有效位上还是精确的(该系统确保float至少有6位有效位, 但这是最糟糕的情况) 。 然而, double类型的变量显示了13个3, 因此它至少有13位是精确的。 由于系统确保15位有效位, 因此这就没有什么好奇怪的了。 另外, 将tub乘以一百万, 再乘读取包含文件以10后, 得到的结果不正确, 这再一次指出了float的精度限制。

    【浮点数在内存中的存储方式】

    通常float为32位(二进制),float至少有6位有效位(十进制)。

    例如:8.25在内存中的表示:
    整数部分:1000
    小数部分: 01
                       0.25*2=0.5     ---  0
                       0.5*2  =1        ---  1
    8.25的二进制表示为:1000.01
    8.25的二进制科学计数法表示为:1.00001*(2^3)
    符号位:0(正数为0,负数为1)
    指数:127(固定偏移)+3 = 130  ----> 10000010(130的二进制)
    小数:00001
    所以合起来8.25在内存中表示为:0 10000010 00001000000000000000000

    一位符号位 + 23位小数位 = 24位二进制数据位 ---> 6位十进制数据位

    【浮点运算的速度通常比整数运算慢,且精度将降低】

    1. #include
    2. using namespace std;
    3. int main(void)
    4. {
    5. float a = 2.34e22;
    6. float b = a + 1.0;
    7. cout << "a = " << a << endl;
    8. cout << "b = a + 1.0 = " << b << endl;
    9. cout << "b - a = " << b-a << endl; //=0,按理说应该=1的。但是......
    10. /*2.34E+22是一个小数点左边有23位的数字。加上1,就是在第23位加1。
    11. 但float类型只能表示数字中的前6位或前7位,因此修改第23位对这个值不会有任何影响。*/
    12. return 0;
    13. }

    输出:

    【算术运算符】

    1. + 运算符对操作数执行加法运算。例如,4+20等于24。
    2. - 运算符从第一个数中减去第二个数。例如,12-3等于9。
    3. * 运算符将操作数相乘。例如,28*4等于112。
    4. / 运算符用第一个数除以第二个数。例如,13/5等于2。
      如果两个操作数都是整数, 则结果为商的整数部分。例如,17/3等于5,小数部分被丢弃(不进行四舍五入)。
      其中一个是浮点数,结果也是浮点数。例如,17.0/3等于5.66667(四舍五入,六位有效数字)。
    5. % 运算符求模。也就是说,它生成第一个数除以第二个数后的余数。例如,19%6为1,因为19是6的3倍余1。两个操作数必须都是整型,将该运算符用于浮点数将导致编译错误。如果其中一个是负数,则结果的符号满足如下规则:(a/b)*b + a%b = a。

    优先级:类似于数学运算。 

    【强制类型转换】

    1. (typeName) value;
    2. typeName (value);
    3. Static_cast (value);

    以上三种方法都可以,例如:

    1. cout << (int) 12.6 <//把12.6强制转换成int类型,只截取整数部分,输出12
    2. cout << float (12.3456789) <//把12.3456789强制转换成float类型,四舍五入,输出12.3457

    将long值赋给float变量在数值范围内会导致舍入误差。
    而把浮点数赋值给整数在数值范围内只会截取整数部分,不进行四舍五入。

    【转义字符】

    【ASCII码】

  • 相关阅读:
    400企业热线电话
    windows编译carla报错:Make sure it is available on your Windows “py“.
    如何从宏观层面构建优秀的大语言模型
    (五)CSS前端开发面试会问到的问题有哪些?
    华为机试 - 最大平分数组
    qt定时器的使用
    c++的作用域 (局部域,类域,名字命名空间,文件域)
    ChatGPT通用人工智能:初心与未来
    JAVA毕业设计Web产品管理系统计算机源码+lw文档+系统+调试部署+数据库
    【Redis】6.Feed流
  • 原文地址:https://blog.csdn.net/qq_39751352/article/details/126037539