"""
通常来说,我们的数据都是以二进制的形式进行
当我们编程定义一个变量时,会根据数据类型及对应的值从内存中给予对应的存储空间
例如 我们定义Number类型 1 : a = 1
我们会在内存中开辟1字节的空间,对应的二进制数表示 0000 0001
这是无符号的Number类型存储形式,当有符号的存储形式,则在最高位上,0表示整数,1表示数据
即 1 的二进制数为 0000 0001
-1 的二进制数为 1000 0001
当两个数相加时 1+ (-1) =0
二进制表示: 0000 0001 + 1000 0001 = 1000 0010 = -2 (十进制)
这很明显不对,但在计算机中时没有出现计算失误的问题。
因此,数字的计算并不能单单靠二进制进行计算
这里就提到了3个概念,原码,反码以及补码
原码是 数值对应二进制数本身
反码:正数值的反码等于正数值的原码,负数值的反码则是绝对值安位取反
即 [1]反码 = 0000 0001 [-1]反码 = 1111 1110
补码:正数值的补码等于正数值的原码,即正数值的原码,补码以及反码是一致的;
负数值的补码等于负数值的反码基础上加1
即 [1]补码 = 0000 0001 [-1]反码 = 1111 1111
当计算时,等于 1 0000 0000,而数值开辟的空间是1字节,机器只会取对应空间的值
即0000 0000 = 0(十进制数)
当数值的计算,都是用二进制的补码形式进行计算,这样才能保证数值计算的准确性。
"""
"""
内存分两个区域,一个是栈区,一个是堆区。栈区等程序结束后自动释放内存空间,堆区则需要手动开辟并释放
一般来说,基础数据类型是在栈区开始空间并存值;
而复合数据类型则是在堆区开辟存储值的空间并且在栈区开辟存放指向堆区地址的空间
当python 定义多个变量且赋同一个值(基本数据类型的值,复合数据类型的地址),相当于在栈区开辟一个值的空间,
定义的多个变量都是指向这个值的内存存储地址,即定义的多个变量地址都是相同的;
定义变量1且将变量2赋值给变量1(变量1 = 变量2),相当于将变量2的内存存储地址给到变量1,
即变量1与变量2的内存存储地址一致,这种可以叫说变量1浅拷贝变量2
变量1深拷贝变量2则是,在内存空间(栈区或者堆区)开辟新的存储空间并将变量2的值放入这新的存储空间,
变量1指向新内存存储地址,而变量2则是指向变量2的内存存储地址,变量1与变量2的地址不一致。
"""