C语言学习day05:计算机内存数据存储方式

点赞、关注+收藏,一起从0学会C语言!!!

        计算机中所有数据都是以补码的形式存在的;

想知道补码,首先我们要了解原码

原码:

有符号整数的二进制编码方式,其中最高位表示符号位,0表示正数,1表示负数。其余位表示数值的绝对值。例如,+10的原码为0000 1010,-7的原码为1000 1010。

用代码理解:

        都知道10的二进制=1010,但是为什么它的原码会是00001010呢

        很好理解:

        首先char是1个字节 ,八位;

        而计算机中存储的数据单位=1字节=8位

        这样我们就知道为什么会有八位了,而10的二进制=1010,所有前三位=0

                首位=0是因为10是正数,正数=0,负数=1

int main()
{
    char ch=10;

    return 0;
}

总结:原码虽然转换方便,但不利于计算

反码:

反码特点:

        正数情况下与原码的值不变

        负数情况下,符号位不变,但其他部分取反(0变1,1变0)

用代码理解:

        这时转换的值=10

        原码=0000 1010;

        反码=0000 1010;

int main()
{
    char ch=10;
    
    return 0;
}

        这时,转换的值=-10        

        原码=1000 1010;

        反码=1111 0101;

int main()
{
    char ch2=-10;

    return 0;
}

总结:反码并不利于计算通常用来作为求补码的中间过渡。

补码:

在计算机系统中,数值一律用补码来存储

补码特点:

        对于正数来说,原码、反码、补码皆相同

        对于负数来说,其补码=它的反码加1

        补码符号位不动,其他位求反,最后整个 数+1,得到补码

        这时转换的值=10

        原码=0000 1010;

        反码=0000 1010;

        补码=0000 1010;

int main()
{
    char ch=10;
    
    return 0;
}

        这时,转换的值=-10        

        原码=1000 1010;

        反码=1111 0101;

        反码=1111 0111;(0101+1)

int main()
{
    char ch2=-10;

    return 0;
}

同时在计算机中,10=0a;

因此在代码中:

int main() {
	char ch = 10;
	printf("%p\n", &ch);
	system("pause");
	return 0;
}

它的结果=000000EB2EF3F5C4(每个计算机不同,所有值也会不同,现在以我的为例)

C语言学习day05:计算机内存数据存储方式_第1张图片

接下来看看内存中这个地址:

C语言学习day05:计算机内存数据存储方式_第2张图片

我们发现第一排的值=0a也就是10

计算:

在计算机系统中,数值一律用补码来存储,的主要原因是:

1.统一0的编码

2.将符号位和其他位统一处理

3.将减法运算转变为加法运算

4.两个用补码表示的数相加时,如果最高位(有符号位)有进位时,则进位被舍弃

通常我们写运算时减法比如76-32算的是减法,但是计算机是不会减法只会加法

所以计算机运算的方法是76+(-32)

76-32/76+(-32)

76:

原码:0100 1100

反码:0100 1100

补码:0100 1100

-32:

给个图(8421法则)计算过程:

C语言学习day05:计算机内存数据存储方式_第3张图片

原码:1010 0000

反码:1101 1111

补码:1110 0000

然后两者补码相加:

补码:0100 1100

补码:1110 0000

总补码:1(舍弃) 0010 1100

总反码:(正的不变)0010 1100;

总原码:(正的不变)0010 1100

所以4+8+32=44(8421法则)

现在再来个答案=负数的:

76-82

76:

原码:0100 1100

反码:0100 1100

补码:0100 1100

-82:

给个图加深印象:

C语言学习day05:计算机内存数据存储方式_第4张图片

原码:(负数=1)1101 0010

反码:1010 1101

补码:1010 1110

然后两者补码相加:

补码:0100 1100

补码:1010 1110

总补码:1111 1010

总反码:1111 1001(负数的补码是由反码+1得来的,所有反推要用补码-1)

总原码:1000 0110=-(2+4)=-6

这就是本次学习的所有内容,请大家多看多想,保持热情,最后C语言一定能学至成功

你可能感兴趣的:(C语言学习,学习)