基本数据类型—算术型
看这一篇的时候头太疼了,第一次接触了宏,也头疼的重新翻起ASCII 编码和存储空间的计算,补码表示这些琐碎的知识点。
先别被困难打倒了,虽然这里又琐碎又复杂,但是实际应用的时候不要求掌握的那么细致,可以先大体看一下这一篇的结构:
-
整型的声明,该部分包括比较详细的表格,不至于下次 遇见这种很细节的定义的时候看不懂,可以当作字典查询使用;
按照有无符号可分为:
a 无符号整型(unsigned integer type):表示 0 和正整数。b 有符号整型(signed integer type):表示负整数、0 和正整数。
另外,按照长短可分为long和short型。
下表格是整形的缩写,蓝色是通用的缩写,也是常用的:
-
可以使用
<climits>
头文件 去展示有符号整型数的最大最小值;(忽略掉末尾的U L即可)
-
宏的定义 见这篇文章
C++基础知识补充_宏的定义和使用 -
字符型char的ASCII编码表示标点符号和大小写字母;
该表中 空栏处指的是没有相应字符的编码。另外,表中的横向和纵向的 0 ~ F 是用十六进制数表示的各位的值。例如:
字符 ‘R’ 的编码是十六进制数 52。
字符 ‘g’ 的编码是十六进制数 67。
-
二进制 十六进制的互相转换;
-
各进制的表达方式
字面量的意思就是用什么样的方式书写数字。
-
二进制和十进制的转换
二进制转十进制
二进制数的每一位都代表一个2的幂次方的值。从右到左,每一位的权值依次是2⁰, 2¹, 2², 2³,依此类推。将每一位的数字(0或1)乘以其对应的权值,然后将所有结果相加,就得到了十进制数。
步骤:- 写下二进制数。
- 从右到左给每一位编号,最右边是第0位。
- 计算每一位的权值:2的位数次方。
- 将每一位的数字乘以对应的权值。
- 把所有结果相加,得到十进制数。
二进制数:1 0 1 1
位数: 3 2 1 0
权值: 2³ 2² 2¹ 2⁰ = 8 4 2 1
计算:
1×8 + 0×4 + 1×2 + 1×1 = 8 + 0 + 2 + 1 = 11
十进制转二进制
将十进制数转换为二进制数,通常使用除以2取余的方法。具体步骤如下:
步骤:
1. 将十进制数除以2,得到商和余数。
2. 将商继续除以2,得到新的商和余数。
3. 重复这个过程,直到商为0。
4. 将所有余数从下往上排列,得到的二进制数就是结果。
11 ÷ 2 = 5 余 1
5 ÷ 2 = 2 余 1
2 ÷ 2 = 1 余 0
1 ÷ 2 = 0 余 1
余数从下往上排列:1 0 1 1
所以,十进制数 11 转换为二进制是 1011。
7. **sizeof() 运算符,**用来计算所占每各种整型空间的大小;可以简单的了解一下,如果大程序中出现空间的报错,可以在定义不同的整型来减少内存的占用;
使用方式见下列代码:
#include <iostream>
using namespace std;
int main()
{
char c;
cout << "char型的大小 :" << sizeof(char) << '\n';
cout << "变量c的大小 :" << sizeof(c) << '\n';
short h;
cout << "short型的大小 :" << sizeof(short) << '\n';
cout << "变量h的大小 :" << sizeof(h) << '\n';
int i;
cout << "int型的大小 :" << sizeof(int) << '\n';
cout << "变量i的大小 :" << sizeof(i) << '\n';
long l;
cout << "long型的大小 :" << sizeof(long) << '\n';
cout << "变量l的大小 :" << sizeof(l) << '\n';
return 0;
}
运行结果为:
将char的size作为一个存储单位,那么剩下的变量的存储的大小可以表示为:
8. typedef():给变量一个别称,使用方法如下:
typedef unsigned size_t; // 定义示例: size_t 是 unsigned 的同义词
- typeid():得到变量的类型,使用方法如下:
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
char c;
short h;
int i;
long l;
cout << "变量c的类型:" << typeid(c).name() << '\n';
cout << "变量h的类型:" << typeid(h).name() << '\n';
cout << "变量i的类型:" << typeid(i).name() << '\n';
cout << "变量l的类型:" << typeid(l).name() << '\n';
cout << "字符字面量'A'的类型:" << typeid('A').name() << '\n';
cout << "整数字面量100的类型:" << typeid(100).name() << '\n';
cout << "整数字面量100U的类型:" << typeid(100U).name() << '\n';
cout << "整数字面量100L的类型:" << typeid(100L).name() << '\n';
cout << "整数字面量100UL的类型:" << typeid(100UL).name() << '\n';
return 0;
}
- 补码
为什么需要补码?
在计算机中,最初有多种方法来表示负数,如原码、反码等,但这些方法在进行加减运算时需要不同的处理逻辑,增加了硬件设计的复杂性。补码的出现解决了这个问题,使得正数和负数的加减运算可以使用相同的电路实现。
补码的表示方法
正数的补码:正数的补码就是其二进制表示,即直接将数字转换为二进制形式。
负数的补码:负数的补码是其绝对值的二进制表示取反(每个1变成0,每个0变成1)后加1。
补码的运算
加法:补码的加法运算可以直接使用二进制加法,不需要区分正数和负数。如果最高位产生进位,这个进位会被丢弃,结果的符号位(最高位)表示结果的正负。
减法:补码的减法可以通过将减数取补码(即取反加1)然后进行加法运算来实现。
用8位补码计算3+(-5)
正数5的二进制表示为00000101,补码也是00000101。
负数5的二进制表示(反码)为11111010,补码为11111011(反码加1)。
进行加法运算3 + (-5):
3的补码:00000011
-5的补码:11111011
加法运算:00000011 + 11111011 = 11111100(结果的补码)
结果11111100是负数的补码,转换为十进制为-2。
好了 今天到此为止吧。。。。