数字的表示和处理

Byte Byte Byte / 2023-06-18 / 原文

 

 原码,补码,反码

  原码

有符号数,正数首个位为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

 

 

浮点数表示

 

 

浮点数运算