什么是bit和sbit?他们有什么区别?
在刚学51单片机的时候刚看到这个两个东西的时候就是一脸懵逼,脑子里面第一反应就是,这是什么鬼啊,C语言里面没说过啊,于是去B站看了51单片机视频教程,终于知道了这是一种数据类型,类似于int、float一样,但是某天自己写代码使用到的时候就一脸懵逼了,如下面函数返回值的类型应该怎么决定?为什么必须要这样?
函数返回值是应该这样写呢?
还是应该这样写?
于是,好奇的我两种情况都试了试,但是事实却是试试就逝世
试第二种的时候编译器报错了
这又是什么情况?难度两个不一样吗?
于是查了一下资料
bit和sbit都是C51扩展的变量类型。
bit
bit编译时分配空间
sfr(特殊功能寄存器)的bit。SFR是系统指定的内存地址。
bit 动态分配的,有编译器来指定内存地址。
bit 可以在外部或内部定义。
bit和int char之类的差不多,只不过char=8位, bit="1位而已"。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。
bit是编译器在的可寻址区分配的一个位变量,是不定的,不是绝对地址目标。
sbit
sbit 只能在外部定义全局变量。
sbit 要在最外面定义,就是说必须定义成外部变量.sbit定义的是SFR(特殊功能寄存器)的
bit
sbit更像是类型定义,不像是变量定义。
sbit: 指示说明性说明
所有可位寻址的位都可由sbit指定,这包括可位寻址区和SFR中的位。
sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。
sbit位寄存器是可位寻址的绝对地址目标,定义后编译器是不会改变位置的。
相关文章









