C++ Primer Plus详解

目录
  • 1.各种数据类型的长度
  • 2.无符号数据类型及cout进制显示
    • 2.1无符号数据类型及溢出
    • 2.2cout十六进制显示
    • 2.3cout八进制十进制十六进制显示
  • 3.char、ASCII、\n
    • 3.1char类型
    • 3.2ASCII与char、cout.put()
    • 3.3转义字符换行
  • 4.const
  • 5.浮点数(整数部分+小数部分)
  • 6.比较大的浮点数
  • 7.float与double的精度
  • 8.float的误差
  • 9.乘除法
  • 10.求模运算符
  • 11.数值转换
  • 12.强制类型转换
  • 总结

1.各种数据类型的长度

int main(void)
{
	using namespace std;
	int n(3); // C++还可以这么赋值
	int m{6};
	int f = {8};
	int n_int = INT_MAX; //声明变量同时赋值=初始化
	short n_short = SHRT_MAX;
	long n_long = LONG_MAX;
	long long n_llong = LLONG_MAX;
	cout << "n = " << n << endl;
	cout << "m = " << m << endl;
	cout << "f = " << f << endl;
	cout << "int is " << sizeof(int) << " bytes." << endl;		// sizeof是运算符不是clmits中的函数.INT_MAX是
	cout << "short is " << sizeof n_short << " bytes." << endl; //函数必须带括号,sizeof(运算符)在这里可以不跟括号,但查看数据类型必须加括号
	cout << "long is " << sizeof n_long << " bytes." << endl;
	cout << "long long is " << sizeof n_llong << " bytes." << endl;
	cout << "Maximum values: " << endl;
	cout << "int: " << n_int << endl;
	cout << "short: " << n_short << endl;
	cout << "long: " << n_long << endl;
	cout << "long long: " << n_llong << endl;
	return 0;
}

2. 无符号数据类型及cout进制显示

2.1 无符号数据类型及溢出

#include <iostream>
#include <climits> //可以查看数据类型最大值最小值
int main(void)
{
	using namespace std;
	short sam = SHRT_MAX;	  //-32768-32767 (16位)   longlong > long(至少32位)> int > short(至少16位)
	unsigned short sue = sam; // 0-65535
	cout << "sam has " << sam << " dolloars and sue has " << sue << " dolloars" << endl;
	cout << "Add 1 dolloars to each account" << endl;
	sam = sam + 1;
	sue = sue + 1;
	cout << "Now sam has " << sam << " dolloars and sue has " << sue << " dolloars" << endl;
	sam = 0;
	sue = 0;
	sam = sam - 1;
	sue = sue - 1;
	cout << "Now sam has " << sam << " dolloars and sue has " << sue << " dolloars" << endl;
	return 0;
}

2.2 cout十六进制显示

#include <iostream>
int main(void)
{
	using namespace std;
	int cheat = 42;	  //十进制
	int waist = 0x42; //十六进制
	int inseam = 042; //八进制
	cout << hex; //修改cout显示整数的方式
	cout << "cheat = " << cheat << " 42 (in decimal)" << endl;
	cout << "waist = " << waist << " 0x42 (in hexadicimal)" << endl;
	cout << "inseam = " << inseam << " 042 (in octal)" << endl; // cout默认以十进制显示整数
	return 0;
}

2.3 cout 八进制十进制十六进制显示

#include <iostream>
int main(void)
{
	using namespace std;
	int cheat = 42;
	int waist = 0x42;
	int inseam = 042;
	cout << "cheat = " << cheat << " 42 (in decimal)" << endl; // cout默认十进制显示
	cout << hex; //修改cout为十六进制显示
	cout << "waist = " << waist << " 0x42 (in hexadicimal)" << endl;
	cout << oct; //修改cout为八进制显示
	cout << "inseam = " << inseam << " 042 (in octal)" << endl;
	return 0;
}

3.char、ASCII、\n

3.1 char类型

#include <iostream>
int main(void)
{
	using namespace std;
	char ch;
	cout << "Enter a character:" << endl;
	cin >> ch;    //cin将键盘输入的M转换为77
	cout << "Hello, thanks you for the " << ch << " character." << endl; //cout将77转换为M,cin和cout的行为由变量类型引导
	return 0;
}

3.2 ASCII与char、cout.put()

#include <iostream>
int main()
{
	using namespace std;
	char ch = 'M';
	int i = ch;
	cout << "The ASCII code for " << ch << " is " << i << endl;
	cout << "Add one to the character code:" << endl;
	ch = ch + 1; //显示下一个字符
	i = ch;
	cout << "The ASCII code for " << ch << " is " << i << endl;
	cout << "Displaying char ch using cout.put(ch)" << endl; // iostream类(数据以及操作数据的方法)的对象cin、cout    矩形(对象)平移(方法)
	cout.put(ch); //用对象访问类里面的操作方法(函数)、
	cout.put('!');
	cout.put('A');
	cout << "Done" << endl;
	return 0;
}

cin与cout的行为由变量引导 

3.3 转义字符换行

#include <iostream>
int main(void)
{
	using namespace std;
	int n = 10;
	cout << "Hello world!" << endl;
	cout << "Good morning!\n";//使用转义字符换行,显示字符串这种方法简单一点,\n是一个字符哦(换行符)
	cout << "What's your name?" << '\n';
	cout << "What's your name?" << "\n";
	cout << "n = " << n << endl;
	cout << "n = " << n << "\n";
	return 0;
}

4.const

#include <iostream>
int main()
{
    using namespace std;
    const int toes = 10; //必须在声明时赋值(之后不准修改)(对const初始化)
    /*const int toes;
    toes = 10;这种是错误的*/
    return 0;
}

5.浮点数(整数部分+小数部分)

#include <iostream>
int main()
{
    using namespace std;
    cout.setf(ios_base::fixed, ios_base::floatfield);
    float tub = 10.0 / 3.0;
    const float million = 1.0E6;
    cout << "tub = " << tub << endl;                             // cout默认输出小数点后六位
    cout << "A million tubs = " << million * tub << endl;        // float精度达不到
    cout << "Ten million tubs = " << 10 * million * tub << endl; // float精度达不到
    double mint = 10.0 / 3.0;
    cout << "A million mint = " << million * mint << endl;
    cout << "Ten million mint = " << 10 * million * mint << endl; // double精度比float高
    return 0;
}

6. 比较大的浮点数

#include <iostream>
int main()
{
    using namespace std;
    float a = 2.34E22; // 2.34e/E+22   2.34*10^22
    float b = a + 1.0;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;          //a = b
    cout << "b - a = " << b - a << endl; // float位数只有前六位或前七位有效
    return 0;
}

7.float与double的精度

float单精度 至少32位 double双精度 至少48位

浮点数在内存中如何存储的?         int 类型 5 以0101二进制存储这个好理解

float 8.25 单精度 内存中32位(bit)       double 64位    计算机存浮点数都是以科学计数法的方式存储的   IEEE标准

8.25 科学计数法 8.25 * 10^0          112.5   科学计数法   1.125 * 10^2    十进制的科学计数法  但是计算机只认识二进制的科学计数法

8.25 二进制的科学计数法(分成整数部分(倒序)+小数部分(正序))  1000.01    转换为科学计数法 为1.00001*2^3

50.25 整数部分(32+16+2)   110010.01         任何一个浮点数二进制科学计数法为     1.?????*2^x    整数部分一定为1

符号占1bit  正数为 0,负数为 1;                    1.00001*2^3     指数3表示小数点右移

0 - 255   中间127  0-126(负次幂) 127-255(代表正次幂)

8.25在内存中的表示: 符号位0           8位指数位 为127+3=130(3次幂)    130 -- 10000010       0(符号位)    10000010(指数位)  00001(小数位,23位) 000000000000000000(18个0)

整数部分1位,小数部分23位,共24位(二进制)     4位对应一个十进制的数    24/4=6   对应十进制有效位6位   二进制32位   课本56页

double类型: 十进制13(52/4)位有效位   二进制64位   符号位1      指数位11   小数位 52

11.17    二进制       1011.001010111100001........(小数部分很难取整,无限长 )   而float最多表示32位小数部分, 二进制超过32位就不对了,十进制超过6位就不对了

26.0在内存中如何存储的? 0100000110100000............

11010.00000000............

1.10100.......0 * 2 ^ 4

符号位:0    指数位:127 + 4 = 131 二进制:10000011  小数位:010000000000...........

0.75 二进制 0.110000.............

1.10*(2^-1)

符号位:0    指数位:127 + (-1) = 126 二进制:01111110  小数位:1000000000...........

-2.5 二进制 10.1

-1.01*2^1

符号位:1    指数位:127 + 1 = 128 二进制:10000000  小数位:0100000000...........

8.float的误差

/*
 * @Description:
 * @Date: 2022-02-14 13:25:40
 * @LastEditTime: 2022-02-14 13:56:58
 * @FilePath: \C++\第三章\class6\6_1.cpp
 */
// 26.0在内存中如何存储的? 11010.00000000............ 1.10100.......0 * 2 ^ 4 符号位:0 指数位:127 + 4 = 131 二进制:10000011 小数位:010000000000...........
#include <iostream>
int main(void)
{
    using namespace std;
    float hats, heads;
    cout.setf(ios_base::fixed, ios_base::floatfield); //可以强制打印小数点后六位(没办法四舍五入),去掉这一句就可以四舍五入,输出61.42000000.......0可以不显示
    cout << "Enter a number: "; // 50.25
    cin >> hats;
    cout << "Enter another number: "; // 11.17
    cin >> heads;
    cout << "hats = " << hats << " heads = " << heads << endl;
    cout << "hats + heads = " << hats + heads << endl; // 61.42  的小数部分 0.42 二进制01101...........无限,但是float二进制小数部分只有23位有效,十进制六位61.4199(近似有效)
    cout << "hats - heads = " << hats - heads << endl;
    cout << "hats * heads = " << hats * heads << endl;
    cout << "hats / heads = " << hats / heads << endl; // folat精度不够,二进制只能显示小数点后23位,所以不准,去掉setf()可四舍五入
    return 0;
}

注视掉 cout.setf()

解决办法:用double   可显示二进制小数点后53位,十进制13位,我们用setf()显示6位显然也是准确的

9.乘除法

#include <iostream>
int main(void)
{
    using namespace std;
    cout.setf(ios_base::fixed, ios_base::floatfield); //显示小数点后六位
    cout << "Integer division : 9/5 = " << 9 / 5 << endl; //整数相除结果取出整数部分
    cout << "Float division : 9.0/5.0 = " << 9.0 / 5.0 << endl;
    cout << "Mixed division : 9.0/5 = " << 9.0 / 5 << endl; //混合类型
    cout << "Mixed division : 9/5.0 = " << 9 / 5.0 << endl; //混合类型  浮点型精度高于整型,提升精度为浮点型
    cout << "Double division : 1e7 / 9.0 = " << 1e7 / 9.0 << endl;              //都当成double类型来处理(精度高) 一般定义浮点数用double,编译器默认当成double处理,除非你强制float
    cout << "FLoat constance division : 1e7f / 9.0f = " << 1e7f / 9.0f << endl; //都当成float类型来处理
    return 0;
}

10.求模运算符

#include <iostream>
int main(void)
{
    using namespace std;
    const int pounds_per_stone = 14; //声明整型类型常量   14榜(pounds)=1英石(stone)
    cout << "Enter your weight in pounds: ";
    int lbs;
    cin >> lbs;
    int stone = lbs / pounds_per_stone;
    int pounds = lbs % pounds_per_stone;
    cout << lbs << "pounds = " << stone << " stone, " << pounds << " pounds." << endl;
    return 0;
}

11.数值转换

#include <iostream>
int main(void)
{
    using namespace std;
    cout.setf(ios_base::fixed, ios_base::floatfield);
    float tree = 3;
    int guess(3.9832); // C++特有赋值方式,这里取出小数的整数部分
    int debt = 6.2E22; //超过了整型的取值范围,结果不确定,对于int(32位 -2^31---2^31-1)太大了
    cout << "tree = " << tree << endl;
    cout << "guess = " << guess << endl;
    cout << "debt = " << debt << endl;
    return 0;
}

12.强制类型转换

#include <iostream>
int main(void)
{
    using namespace std;
    int auks, bats, coots;
    auks = 19.99 + 11.99;            //计算机用double类型相加计算再转换为整型,结果取整=31
    bats = (int)19.99 + (int)11.99;  // C语言格式
    coots = int(19.99) + int(11.99); // C++语言格式
    cout << "auks = " << auks << endl;
    cout << "bats = " << auks << endl;
    cout << "coots = " << auks << endl;
    char ch = 'Z';
    cout << "The code for " << ch << " is " << int(ch) << endl;
    cout << static_cast<int>(ch) << endl; //强制类型转换
    return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 《C++ primer plus》读书笔记(一)

    第一章 1.预处理器--#include<iostream>将iostream文件内容添加到程序中.老式C头文件保留了扩展名.h,而C++头文件没有扩展名. (有些C头文件被转换为C++头文件,去掉扩展名,并在前面加c,如cmath) 2.名称空间--相当于Java中的package,using编译指令相当于Java中的import.头文件没有.h前缀时,类.函数和变量是C++编译器的标准组件,被放置在名称空间std中. 3.类的本质--类是用户定义的一种数据类型.类定义描述的是数据格式及其用

  • 《C++ primer plus》读书笔记(二)

    第五章 1.for循环--for(initialization; test-expression; update-expression) body // test-expression 会被转换为bool,0为false,非零为true 2.表达式--表达式是值或值与运算符的组合.赋值表达式的值为其左侧成员的值,而赋值运算符是从右到左结合的. 3.a++和++a-- (1)对于内置类型,两种执行效率相同. (2)若重载运算符,对于类而言,前缀将值加1,返回结果:后缀会复制一个副本,加1后返回副本

  • C++ Primer Plus 第四章之C++ Primer Plus复合类型学习笔记

    目录 1. 数组概述 1.1 数组的定义 1.2 数组的声明 1.3 复合类型的数组 1.4 数组的初始化规则 1.5 C++11数组初始化方法 2. 字符串 2.1 C++处理字符串的两种方式: 2.2 字符串常量的拼接 2.4 读取一行字符串的输入 3. string类 3.1 string对象的方式 3.2 复制.拼接和附加 4. 结构简介 4.1 创建结构的步骤: 4.2 结构的定义: 4.3 结构的初始化(C++11) 4.4 成员赋值 5. 共用体 5.1 结构体和共用体的区别 5.

  • 《C++ primer plus》读书笔记(三)

     第九章 1.C++程序的组成-- (1).头文件: 包含结构声明和使用这些结构的原型. (2).源代码文件: 包含与结构有关的函数的代码. (3).源代码文件: 包含调用与结构有关的函数的代码. 2.头文件-- (1).常包含的内容: 函数原型:#define或const定义的符号常量:结构声明:类声明:模板声明:内联函数. (2).若文件名包含在尖括号中,编译器将在存储标准头文件的主机系统的文件系统中查找. (3).若文件名包含在双引号中,编译器首先查找当前的工作目录或源代码目录,再在标准位

  • c++primer类详解

    目录 1. 定义抽象数据类型 1.1 设计Sales_data类 1.2 定义类相关的非成员函数 1.3构造函数 1.4 拷贝.赋值和析构 2 访问控制和封装 2.1 友元 2.2 类的其他特性 2.2.1 类成员再探 2.2.2 返回*this的成员函数 2.2.3 类类型 2.2.4 友元再探 2.4 类的作用域 2.4.1 名字查找和类的作用域 2.5 构造函数再探 2.5.1 2.5.2 委托构造函数 2.5.3 默认构造函数的作用 2.5.4 隐式的类类型转换 2.5.5 聚合类 2.

  • C++ Primer Plus详解

    目录 1.各种数据类型的长度 2.无符号数据类型及cout进制显示 2.1无符号数据类型及溢出 2.2cout十六进制显示 2.3cout八进制十进制十六进制显示 3.char.ASCII.\n 3.1char类型 3.2ASCII与char.cout.put() 3.3转义字符换行 4.const 5.浮点数(整数部分+小数部分) 6.比较大的浮点数 7.float与double的精度 8.float的误差 9.乘除法 10.求模运算符 11.数值转换 12.强制类型转换 总结 1.各种数据类

  • C++详解Primer文本查询程序的实现

    15.9的文本查询程序是对12.3节的文本查询程序的扩展,而使用的主要知识也是15章的核心:继承和多态,即面向对象程序设计. 恩,这一节看的过程中,会有很多不理解.特别是在没有把整个程序都看完之前,会有很多疑惑,而看完之后,再思考思考,回头再看本节的前面所写的程序介绍,会有一些感悟.更加清楚这个程序的原理. TextQuery.h #ifndef QUERY_TEXTQUERY_H #define QUERY_TEXTQUERY_H #include<iostream> #include<

  • C++ 静态成员的类内初始化详解及实例代码

    C++ 静态成员的类内初始化详解及实例代码 一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++ 静态成员的"类内初始化"那就容易迷糊了. 我们来看如下代码: //example.h #include<iostream> #include<vector> using namespace std; class Example{ public: static double rate = 6.5; static const int vecSi

  • C++中友元的实例详解

    C++中友元的实例详解 尽管友元被授予从外部访问类的私有部分的权限,但他们并不与面向对象的编程思想相悖:相反他提高了公共接口的灵活性. 一.友元类 友元声明可以位于公有.私有活保护部分.其所在位置无关紧要 我直接贴出一个摘自< c++ primer plus >的例子来演示 c++ 友元类 其中 Remote 为 Tv的友元类. Tv.h #ifndef TV_H_ #define TV_H_ /*一个类 电视 */ class Tv { public: friend class Remote

  • C++获取类的成员函数的函数指针详解及实例代码

    C++获取类的成员函数的函数指针详解 用一个实际代码来说明. class A { public: staticvoid staticmember(){cout<<"static"<<endl;} //static member void nonstatic(){cout<<"nonstatic"<<endl;} //nonstatic member virtualvoid virtualmember(){cout<

  • 详解C++基础——类继承中方法重载

    一.前言 在上一篇C++基础博文中讨论了C++最基本的代码重用特性--类继承,派生类可以在继承基类元素的同时,添加新的成员和方法.但是没有考虑一种情况:派生类继承下来的方法的实现细节并不一定适合派生类的需求,此时派生类需要重载集成方法. 二.重载方法及虚函数 我们讨论<C++ Primer Plus>中的如下场景:银行记录客户信息,包括客户姓名.当前余额.客户这一类别当然能够创建客户对象.存款.取款以及显示信息.银行需要特殊记录具有透支权限的客户,因此这一类别的客户要额外记录透支上限.透支贷款

  • 详解C++基础——类继承

    一.前言 好吧,本系列博客已经变成了<C++ Primer Plus>的读书笔记,尴尬.在使用C语言时,多通过添加库函数的方式实现代码重用,但有一个弊端就是原来写好的代码并不完全适用于现在的情况.OOP设计思想中类的继承相比来说更为灵活,可以添加新的数据成员和方法,也能修改继承下来方法的实现细节,同时还保留了原有的代码.开始进入正题. 二.类继承示例 场景如下:现需要记录乒乓球运动成员的信息,包括姓名和有无空余桌台.其中有一部分成员参加过比赛,需要将这一部分单独提出并记录他们在比赛中的比分.因

  • C++11 智能指针之shared_ptr代码详解

    C++中的智能指针首先出现在"准"标准库boost中. 随着使用的人越来越多,为了让开发人员更方便.更安全的使用动态内存,C++11也引入了智能指针来管理动态对象. 在新标准中,主要提供了shared_ptr.unique_ptr.weak_ptr三种不同类型的智能指针. 接下来的几篇文章,我们就来总结一下这些智能指针的使用. 今天,我们先来看看shared_ptr智能指针. shared_ptr 智能指针 shared_ptr是一个引用计数智能指针,用于共享对象的所有权也就是说它允许

  • C++中vector操作方式详解(多种方式)

    1. vector: 1.1 vector 说明 vector是向量类型,可以容纳许多类型的数据,因此也被称为容器 (可以理解为动态数组,是封装好了的类) 进行vector操作前应添加头文件#include <vector> 1.2 vector初始化: 方式1. //定义具有10个整型元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值,其值不确定 vector<int>a(10); 方式2. //定义具有10个整型元素的向量,且给出的每个元素初值为1 vec

随机推荐