C语言学习第004课——进制、数据存储方式、有符号数和无符号数的取值范围、数值溢出

进制

二进制,八进制,十进制,十六进制之间的转换太熟悉了,就不写了
下面学习一个十进制的小数转换为二进制的方法:小数部分和2相乘,取整数,不足1取0,每次相乘都取小数部分继续乘,小数点后有几位就留几位二进制

 0.432
*    2   取整
 0.864    0
*    2
 1.728    1
*    2   
 1.456    1
所以0.432的二进制表示为0.011

当前计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的
一些表示大小的术语

bit  比特   一个二进制代表1位,一个位只能表示0或者1两种状态,数据传输习惯以位(bit)为单位,比如联通宽带
Byte 字节   一个字节为8个二进制,计算机中存储的最小单位是字节,数据存储习惯以字节为单位
WORD 双字节 两个字节  16位  在windows中一个汉字2个字节  Linux中一个汉字3个字节
DWORD  两个WORD  4个字节  32

数据存储方式

上面说到,数据在计算机中主要是以补码的形式存储的,现在我们来了解一下数据的原码,反码和补码

  • 原码
    特点:最高位作为符号位,0表示正,1表示负
    其他数值部分就是数值本身绝对值的二进制数
    负数的原码是在其绝对值的基础上,最高位变为1
    原码表示法简单易懂,但是不便于加减运算,容易出错

  • 反码
    对于正数,反码与原码相同
    对于负数,符号位不变,其他部分取反(1变0 0变1)
    反码运算也不方便,通常用来作为求补码的中间过渡

  • 补码
    对于正数,原码,反码,补码相同
    对于负数,其补码为它的反码+1
    补码符号位不动,其他位求反,最后整个数加一,得到原码

10为例    原码  0000 1010 
           反码  0000 1010
           补码  0000 1010-10为例   原码  1000 1010
           反码  1111 0101
           补码  1111 0110

在计算机系统中,数值一律用补码来存储 原因是:
统一了0的编码
将符号位和其他位置统一处理
将减法运算转变为加法运算

两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃,
示例: 76 - 32 = 76 + (-32)

 76  原码:0100 1100
	 反码  0100 1100
	 补码  0100 1100          0100 1100
-32  原码  1010 0000
	 反码  1101 1111        +
	 补码  1110 0000          1110 0000
						   = 1 0010 1100  最高位有进位 舍去高位  0010 1100
						   反码 0010 1100
						   原码 0010 1100 = 44

有符号数和无符号数的取值范围

  • 有符号数
    char类型
    最大正数  0111 1111  = 127
    最小负数  1111 1111  = -127
    -127-1 = 1000 0000-0  数据存储时,将-0对应的区间值设置为-128
    
  • 无符号数
    char类型 取值范围为0-255

数值溢出

当超过一个数据类型能够存放的最大范围时,数值为溢出
符号位溢出会导致数的正负发生改变,最高位的溢出会导致最高位丢失

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值