bit表示的数值范围为什么是 127 ~ -128

一、基本单位

bit (比特):

  表示二进制位,位是计算机内部数据储存的最小单位,逢二进一。一个二进制位可以表
  示0, 1两种状态,两个二进制位可以表示00, 01, 10, 11四种状态 …

byte (B, 字节):

  八个二进制位(bit)为一子节(byte),字节是计算机中数据处理的基本单位。
  一个字节数通常有三种表示,即原码, 反码和补码。

二、原反补码
正整数 :
原反补码相同,都是正整数的二进制表示
  负整数 :
  原码 :
  数值的二进制
  反码:
  原码各个位取反
  补码:
  反码的基础上加1

三问题分析

首先,一个字节有8位二进制位,理论上可以储存的数量为 2^8 即256。由于数字需要进行相应的运算(+ - * / …),所以我们希望256个数里面能够包含相应的负数,然而二进制本身没有表示负数。
 
  所以,规定字节的第一个位是符号位,并且0表示正数,1表示负数。比如001001011表示正数,110100011表示负数。
 
  这样一来,正数就能表示 2^7 即 127 ~ 0 之间的数,负数则能表示 - 2^7 即 -127 ~ 0 之间的数字。这就对于0的存储出现了重复, “+0” 即00000000 和 “-0” 即10000000。逻辑上来说 “+0” 和 “-0”同时存在,显然不合理,存储上来说 “+0” 和 “-0” 表示一个数但是占用了两个存储位,也不合理。
 
  既然0重复不合理,那么是否可以只保留一种作为0的表示,另外一种作为其他数的表示呢?如果可以的话,不就解决了逻辑上和存储上的问题了吗?
 
  那么到底是保留 “+0” 还是 保留 “-0” 呢?去除掉的那个“0”又表示什么数呢?首先,当前一个字节已经可以保存 127 ~ -127 (0重复) 即255个数。对于额外保存的数,我们当然是希望保存这个范围之外的数,并且最好“接壤” 127 ~ -127这个范围,那么优先考虑 128 和 -128。我们知道,字节的存储其实是使用补码来表示的,-127的补码是 10000001,这个数字 减1 刚好是 “-0” 10000000,-127 减1 等于 -128,所以这里将 “-0” 10000000 表示 -128 最合适。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习Python语言需要与实例相结合才能事半功倍。傻瓜教程来啦───使用Microbit播放音乐,显示图像或文字。 目的: 循环: 重复执行一段代码 列表: 存放多个数据或命令 条件语句: 通过if语句,让代码来判断条件 技能: 如何在microbit的屏幕上显示图像或文字 如何发现microbit的按键被按下 如何通过扬声器来播放音乐 所需软硬件: UpyCraft-Micropython V0.24 Micro:bit主板 数据线 扬声器Microbit与扬声器连接示意图: 连线效果图: 运行成功效果: 、代码详解: 4 5from microbit import * import music 第4行:你可以使用这个模块里面的成员函数。导入的模块越多,可以调用的成员函数也越多,但会占用更多的内存。你可以通过Microbit模块控制屏幕显示、检测按钮状态、音乐播放等。 7 8 910 music.set_tempo(bpm=220) Player_A_tune = ["c", "d", "e", "f", "g"]Player_B_tune = ["g", "f", "e", "d", "c"] 第7行:控制当按键按下时音乐的播放速度,数值越大,播放越快。 第8行和第10行:定义2个列表,均含5个字符。这些字符代表着音符的名字。 你可以自己写出更好的曲调,这里还有一些曲调可供参考: "c#:4" :播放c调4个节拍 "db5:1" :播放D调1个节拍,5代表播放比C调多一个八度音阶(即音阶4) "eb3:3" 播放E调3个节拍,第一个3代表播放比C调多一个八度音阶(即音阶4) 12 13 1415 16 17 18 19 20 21 22 23 24 display.scroll("Quiz buzzer") while True:display.show(Image.HAPPY) if button_a.was_pressed(): display.show("A") music.play(Player_A_tune) sleep(2000) elif button_b.was_pressed(): display.show("B") music.play(Player_B_tune) sleep(2000) sleep(20) 第12行:在屏幕上滚动显示字符' Quiz buzzer '/ " Quiz buzzer "。必须是英文字体的单引号或双引号。 第14行:while循环,后面的条件满足时,将会执行后面的语句,执行完后,在判断条件是否满足,以此循环,直到条件不满足时退出。这里的True表示条件为真,那么程序会一直运行14到24行的代码。 Python:Microbit8 缩进是判断逻辑语句范围的标准,在python中非常重要。Python小白们要重视啊~ 第15行:显示一个笑脸。 第16到19行与第20到23行的功能相似:判断按键是否按下。如果按键a按下,显示‘A’播放列表‘Player_A_tune’,睡眠2秒,如果按键b按下,显示‘B’播放列表‘Player_B_tune’。 第24行:让程序睡眠20毫秒,然后继续进入循环。 下面是microbit的音乐代码,有一些错误供大家修改,‘#’可以注释(屏蔽)一行代码,可以用来判断BUG的位置。 Python是区分大小写的 *Python中缩进很重要 如果你将代码调试出来了,你可以试试同时按下2个按键。你会发现它会显示a按键被按下。 转自DF社区-Nana
基于PCF8591芯片AD DA实验例程C51单片机KEIL源码工程文件5个合集: PCF8591 1602液晶显示 PCF8591 1路AD数码管显示 PCF8591 4路AD数码管显示 PCF8591 DA输出模拟 PCF8591 输出锯齿波 main() { unsigned char num=0,i; unsigned char temp[7];//定义显示区域临时存储数组 float Voltage; //定义浮点变量 LCD_Init(); //初始化液晶 DelayMs(20); //延时有助于稳定 LCD_Clear(); //清屏 while (1) //主循环 { for(i=0;i<5;i++)//连续读5次,取最后一次,以便读取稳定值 num=ReadADC(0); //读取第1路电压值,范围是0-255 Voltage=(float)num*5/256; //根据参考电源VREF算出时间电压,float是强制转换符号,用于将结果转换成浮点型 sprintf(temp,"V0 %3.2f ",Voltage);//格式输出电压值,%3.2f 表示浮点输出,共3位数,小数点后2位 LCD_Write_String(0,0,temp); for(i=0;i<5;i++) num=ReadADC(1); Voltage=(float)num*5/256; sprintf(temp,"V1 %3.2f ",Voltage); LCD_Write_String(8,0,temp); for(i=0;i<5;i++) num=ReadADC(2); Voltage=(float)num*5/256; sprintf(temp,"V2 %3.2f ",Voltage); LCD_Write_String(0,1,temp); for(i=0;i<5;i++) num=ReadADC(3); Voltage=(float)num*5/256; sprintf(temp,"V3 %3.2f ",Voltage); LCD_Write_String(8,1,temp); //主循环中添加其他需要一直工作的程序 DelayMs(200); } } /*------------------------------------------------ 读AD转值程序 输入参数 Chl 表示需要转换的通道,范围从0-3 返回值范围0-255 ------------------------------------------------*/ unsigned char ReadADC(unsigned char Chl) { unsigned char Val; Start_I2c(); //启动总线 SendByte(AddWr); //发送器件地址 if(ack==0)return(0); SendByte(0x40|Chl); //发送器件子地址 if(ack==0)return(0); Start_I2c(); SendByte(AddWr+1); if(ack==0)return(0); Val=RcvByte(); NoAck_I2c(); //发送非应位 Stop_I2c(); //结束总线 return(Val); } /*------------------------------------------------ 写入DA转换数值 输入参数:dat 表示需要转换的DA数值范围是0-255 ------------------------------------------------*/ /*bit WriteDAC(unsigned char dat) { Start_I2c(); //启动总线 SendByte(AddWr); //发送器件地址 if(ack==0)return(0); SendByte(0x40); //发送器件子地址 if(ack==0)return

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值