信息的表示和处理
信息的存储
- 数据按字节的形式存储,实际运算时按字(数据总线的条数)进行存取。
- 大端指的是数据的低字节部分存储在高地址
- 小端指的是数据的高字节部分存储在低地址
- 对于0x01234567 大端模式的低地址存储的值是【0x12】,小端模式的搞地质存储的值是【0x67】
- C++测试大小端的简单方法:
- C语言的按位操作和逻辑运算不同,逻辑运算的结果只有0和1
- C语言的移位操作
无符号数 +正数 | 有符号数(负数) | |
---|---|---|
左移 | 向左移动,末尾补0 | 向左移动,末尾补0 |
右移 | 向右移动,高位补0 | 向右移动,高位补1 |
数值的表示
- 有符号数用补码表示,无符号数没有符号位,直接表示数值
- 补码的最高位(第w位)的权重为 - 2w,无符号的权重为 2w
正数的补码=原码 =反码【正数的补码最高位权重为0*(-2w)=0】
[+5]原/反/补=【0101】(此处0是符号位表示正数)
负数的补码=反码(=原码每位取反)+1
[-5]补=【1011】(此处1是符号位表示负数)
[-5]反=【1010】(此处1是符号位表示负数)
[-5]原=【1101】(把+5的符号位变反)
-
有符号数与无符号数的最大最小值
无符号数的最小值永远为0,无符号数为【1000…0】 -
有符号数与无符号数的扩充位
有符号数和正数都是高位扩充0
负数高位扩充1
- 有符号数与无符号数的截断
无符号数截断k位,相当于原数mod2k,去掉后面k位即可
有符号数截断k位,相当于原数mod2k,去掉后面k位,得到的数进行有符号的表示。
- 有符号数与无符号数的转换
有符号数转无符号数时,不需变换二进制,只需要原来的有符号数的二进制表示的数的最高位权重变为2w,相当于有符号为负数,整个数值加上2w
无符号数转有符号数时,符号位为1的数,整个数值减去2w
- 特别-1的补码表示是全1,全1也是无符号数的最大值
整数的运算
1.无符号数相加的溢出
example:
2.有符号数相加的溢出
3.减法
y-(x) = y+(-x)
无符号数的减法,利用溢出求相反数
有符号数的减法
乘法(可用向左移位和加减法代替)
浮点数的表示
1.规格化数
2.非规格化数
E=0 ===》s为0表示+0,s为1表示负0
3.无穷大的数
E=255,尾数为0 ====》s为0表示正无穷大,s为1表示负无穷小
E=255,尾数不为0 ===》不是一个数
4、int类型转float类型
舍入方法
向零舍入:直接舍弃小数部分