数字的表示和处理
原码,补码,反码
原码
有符号数,正数首个位为0,负数首个为1
5 原码为 0000 0101
-5的原码 1000 0101
在使用原码表示负数时,会出现加减法中需要特殊处理符号位的问题,如果直接相加这会得到-10不是正确答案。如果想用原码直接进行加减运算,需要特别注意符号位的处理,计算过于繁琐。
补码
使用补码来表示一个负数,需要将其原码按位取反(即0变为1,1变为0),然后再加上1。
以-5为例 将5的原码为 0000 0101取反为 1111 1010 后加1 得到 1111 1011
从1111 1011得到-5 可以将首位值取出: -1000 000 + 0111 1011 >>> -1*27+ 0111 101 = -5
反码
反码:正数的反码还是等于原码;负数的反码就是它的原码除符号位外,按位取反。
-5的原码 1000 0101 反码11111010
计算机中主要使用补码来表示有符号数。
字数据大小
计算机都有一个字长,表明指针数据的大小,字长决定了寻址的大小。以32位系统中 int * ,char *指针大小为4个字节,4*8=32位,最多4GB寻址空间,64位系统中 int * ,char *指针大小为8个字节,8*8 = 64位,寻址16EB大约1.84*1019字节。

寻址和字节顺序
存储一个int 数据x 32位 4个字节0x01 23 45 67 取地址&x为0x100,那么x的4个字节将被存储在0x100,0x101,0x102,0x103的位置。0x01为x的高字节,0x67为x的低字节,x中字节和地址的对于关系有两种。一种是低地址放低字节,一种是高地址放高字节。引出两种不同方式:大端法和小端法。


#include <iostream> int main(int argc, char *argv[]) { char x = 1; char y = 2; char z = 3; char u = 4; int *p ; p =(int *) &x; printf("%d",*p); //*p = 0b 0000 0100 0000 0011 0000 0010 0000 0001 return 0; }
可以看出在windows上是小端模式。
数字类型转换
强制类型转换的结果,只是更改解释字节方式,并没有修改字节位值。
位运算、逻辑运算、移位运算
overflow和underflow
浮点数表示