Lab2 data types and arithmetic operators(done 缺少c和c++都有自己的一套标准输入输出解释部分)

C++ Formatting with cout

Floating-point types are displayed with a total of six digits, except that trailing zeros(尾随零) aren’t displayed.

The float number is displayed in fixed-point notation or else in E notation depending on the value of the number. In particular, E notation is used if the exponent is 6 or larger or -5 or smaller.
下面是一个例子
Pasted image 20240929111433.png

C++ provides two methods to control the output formats

Using member functions of ios class

第一个原型cout.set(fmtflags):

Pasted image 20240929194751.png
举例来说

#include <iostream>
using namespace std;

int main() {
    bool flag = true;

    // 使用 setf 设置 boolalpha 标志,显示布尔值为 true/false
    cout.setfboolalpha;
    cout << "Boolean: " << flag << endl; // 输出 "true"

    // 设置十六进制格式
    int num = 255;
    cout.setfhex;
    cout << "Hexadecimal: " << num << endl; // 输出 "ff"

    return 0;
}

输出

Boolean: true
Hexadecimal: ff

第二个原型cout.set(fmtflags,fmtflags):注意两个参数及其对应。

Pasted image 20240929194823.png

#include <iostream>
using namespace std;

int main() {
    double pi = 3.141592653589793;

    // 使用双参数版本,改变浮点数格式为科学计数法
    cout.setfscientific, ios::floatfield;
    cout << "Scientific: " << pi << endl;

    // 将浮点数格式设置为固定小数点形式
    cout.setffixed, ios::floatfield;
    cout << "Fixed: " << pi << endl;

    return 0;
}

结果:

Scientific: 3.141593e+00
Fixed: 3.141593

解释:

两种对比

更多的ios class成员

cout.width(len) //set the field width
cout.fill(ch)//fill character to be used with justified field
cout.precision(p)//set the precision of floating-point numbers

Pasted image 20240929202802.png

效果解除

The effect of calling setf() can be undone with unsef()
Pasted image 20240929202939.png

Using iomanip manipulators

注意
#include  <iomanip>

我们有一些操作符也能完成上面的效果。
例如下面的这些
Pasted image 20240929203630.png
Pasted image 20240929203644.png
使用的例子如下
Pasted image 20240929203749.png

更多

Pasted image 20240929204025.png

对比

Exercise

1

Pasted image 20240929210214.png
结果
Pasted image 20240929210237.png

答案

a: 我们定义了一个有符号char,实际上,最多能存127,但是我们让他自增了一个,相当于01111111变成了10000000,正好是最大的负数。
b:是一个无符号的char,代表最大的二进制数,就是11111111,++后直接变成00000000
c:同b,从00000000变成了11111111.

2

Pasted image 20240929210726.png
结果没问题。
Pasted image 20240929213250.png

3

Pasted image 20240929213319.png

Pasted image 20240929213509.png

我的解释

是这样的,浮点是其实是采样,第二个虽然是0.1但是存在变量中的真实数字是有一个小误差的,这个误差累加十次仍然不能在有限的精度下看出来,因此跟1.0f不相等。

我们看一下是不是这样。

Pasted image 20240929214352.png

果然如此,就是不一样的。

4

Pasted image 20240929214501.png

编译消除所有警告 -w

g++ -o lab2_4 lab2_4.cpp -w

Pasted image 20240929215118.png

a是因为41.98,但是赋值给a的时候,a是一个int,发生了强制类型转换,小数部分失踪,第二个b是因为直接进行类型转换相当于19加上21,c是因为右边的两个数全是int类,因此结果自动也是int类型,保留整数部分,最后一个是因为有一个double类型,右边最后是double。

5

Pasted image 20240929215709.png

结果是30.

很正常,因为auto在第一步中就变成了int类型,第二步其实是double的常量强制转换为int,第三步是一个int和一个double相加,计算过程中两者全部变成double,但是最后发生强制类型转换成int,因此是30