C/C++(基础编码-补码详解)

两个数的交换

1.引入第三者。
2.求和运算,求差。(这样会产生内存溢出)
3.异或运算

    a = a^b;
    b = a^b;
    a = a^b;
    8b(bit位) = 1B(Byte=字节)//最小单位是字节

32位机:2^32 = 4G寻址能力
(王爽--统一编址,汇编语言)
char类型一个字节,8位。[-128,127],2^8=256种,
why?[-128,127];深层的编码采用补码,1,表示负数。
正常的:

    0000 0000    1
    0000 0001    2
    0111 1111    127

    ...
    1000 0000    -0
    
    ...
    1111 1111    -127

这样1+-1=-2;
补码规则:

    0000 0000    0
    0000 0001    1
    0111 1111    127

    ...
    1000 0000    -128
                 -127   
    
    ...
    1111 1111    -1

计算机只会做加法,1+-1=0;0000 0001 + 1111 1111= 0000 0000;高位溢出得0;

#include<stdio.h>
int main() {
    char a = 0;
    disBin(a);
    char b = 1;
    disBin(b);
    char c = 2;
    disBin(c);
    char d = 127;
    disBin(d);
    char e = -128;
    disBin(e);
    char f = -2;
    disBin(f);
    char g = -1;
    disBin(g);
}

//打印一个数的二进制
void disBin(char ch) {
    int i = 8;
    while(i--) {
        if((1<<i) & ch) {
            printf("1");
        }else {
            printf("0");
        }
        if(i%4 == 0) {
            printf(" ");
        }
    }
    putchar(10);
}

补码的出现所有的乘法,除法,减法,都用减法实现。
补码的规则:(运算互为逆运算)
所有的整数的补码是他本身,所有的负数,取绝对值后取反,加一。
逆过程的运算,最高位是1,是负数。全部参与运算取反加一。
0的补码是0;
补码的运算相当于12进制的时钟,其中顺时针为正,逆时针为负。例如:当前时钟在3点,要点到8点。可以顺时针一可以逆时针。3+5=8,(3+12)-7=8;中的12溢出,在这之中相加互为12的称之为“补数”。
计算机中的所有减法,乘法,除法都可有加法计算。
1-2=1+(-2),也就是相当于1加上-2的补码。
注意:一个8位的空间,如果用来表示无符号数0-255(0-28-1),如果表示有符号的数:-128-127(-27-2^7-1)。

sizeof();

sizeof(char);//1字节
sizeof(short);//2字节
sizeof(int);//4字节
sizeof(long);//4字节
sizeof(long long);//8字节
1字节 char
0      - 255 unsigned char(无符号) 0     -2^8-1
-128   - 127 signed char           -2^7  -2^7-1
2字节 short
0      - 65535    0       - 2^16-1
-32768 - 32767    -2^15   - 2^15-1
4字节 int
0      - 2^32(40亿)
-2^31  - 2^31-1
long(4个字节)没有扩展,
long long(8个字节)。
0      - 2^64
-2^62  - 2^63-1

int 基本整型 理想的32位机,地址总线和数据总线都是32位的。

有效数字,从左至右不为0的数字。超出类型的限制之后的数字不保证正确。
float,doouble;

数据类型图:

原文地址:https://www.cnblogs.com/intelwisd/p/8169688.html