程序是对内存的抽象,而变量是这种抽象的最基本单位。—— 布莱恩·克尼汉(Brian Kernighan)
在本章中,我们将学习几种常见变量类型的使用,不同类型的变量储存的信息不同,占用的内存空间大小也不同
| 类型 | 存储范围 | 占用内存 | 占位符 |
|---|---|---|---|
| int | -2,147,483,648 ~ 2,147,483,647 | 4 字节 | %d |
| long long | -9\times10^{18} ~ 9\times10^{18} | 8 字节 | %lld |
| char | -128 ~ 127 | 1 字节 | %c |
| bool | 0 (false) 或 1 (true) | 1 字节 | %d |
| float | \pm10^{38} (有效精度 6 位) | 4 字节 | %f |
| double | \pm10^{308} (有效精度 15 位) | 8 字节 | %lf |
最常用的变量类型是 int,它支持正负 21 亿的整数存储,也就是说,当你的运算结果大于 2 147 483 647 时,它就会出错
通过引进 long long,可以支持 \pm2^{63} 次方的整数储存,代价是占用更多的储存空间
float 和 double 用于储存小数,使用科学计数法,形如 x\times10^y,优势在于用并不大的内存空间可以储存极大的数值,如 3.1416\times10^{100},但它的 "x" 位数仍然相较有限,不能存储太大的数据,也就是说 3.14\times10^1 + 3.00\times10^{100} = 3.00\times10^{100}, 会出现丢精;由于现代计算机内存较为富裕,float 由于精度不佳正在逐步退出历史舞台
char 仅占用 1 字节,可以表示 -128 ~ 127 内的整数,使用其正数部分,表示英文字母和一些标点符号,称为 ascii 码表
bool 仅表示逻辑真 true 或逻辑假 false,任何非 0 值(包括负数,小数,反正只要不是 0)的值都为 true,虽然逻辑上它仅需一个二进制位就能表示,但由于字节(八位二进制)是计算机存储的基本单位,因此它也需占用一个字节(char 浪费负数部分不表示字符,也是同样的原因)
运算具有优先级,其逻辑相当于常规数学逻辑,详见 C++ 优先级表
简单来说,运算的加减乘除遵循传统四则运算,如 cout << 1 + 2 * 3 - 4; 输出 3
int 无法储存小数,在遇到小数时遵循向零舍入,即正数向下舍入,负数向上舍入,如 cout << 14 / 5; 输出 2
另有取模运算 %,用于计算模结果,即整除运算后的余数,如 cout << 5 % 3; 输出 2
类型和类型之间运算,遵循向更大更精确的类型兼容,如 int + long long -> long long,double / int -> double
本题需要你读入两个整数 a, b
请你分别输出 a+b, a-b, a*b, a/b, a\%b 的结果,除法运算结果保留整数,向零舍入
输入
输入仅一行,两个整数 a, b (-10^9 \le a, b \le 10^9, b \neq 0)
输出
输出五行,具体格式见样例,不含空格
样例
| 标准输入 复制文本 |
5 7 |
| 标准输出 复制文本 |
a+b=12 a-b=-2 a*b=35 a/b=0 a%b=5 |
提示
思考:
在结合运算中,模运算的优先级是怎么样的呢?对负数取模的情况是怎么样的呢,模负数呢?
如果你使用 c++ 通过此题,那么 c 语言能通过吗?在 c 语言做法中,你在输出 % 时遇到什么问题