c语言二进制数表示_C语言:数据类型与运算符

一、数据类型

ec0cd123c4a0575c5468fbea8e5c826a.png

除void类型以外,基本的数据类型之前都可以加各种各类修饰符。在基本类型前加类型修饰符可以更加准确地对类型进行定义。

1)signed———“无符号”之意,可以修饰int、char基本类型。

注意:默认的int型定义为有符号整数,因此对int型使用signed是冗余的。signed的重要用途是在char类型默认为无符号时,使用signed修饰char,表示有符号字符型。

2)unsigned——“无符号”之意,可以修饰int、char基本类型。

3)long——“长型”之意,可以修饰int、char基本类型。

4)short———“短型”之意,可以修饰int基本类型。

5)signed和unsigned也可以用来修饰long int和short int,但不能修饰double和float类型。

6)当类型单独使用(即将修饰的基本类型省略)时,系统默认其为int类型,因此下面几种用法是等价的。

signed 等价于 signed int

unsigned 等价于 unsigned int

long 等价于 long int

short 等价于 short int

1aafdd83ea02a1bb0aa1b9f71310a592.png

计算机处理的最小单元就是位(bit),一个位的值要么是0,要么是1,只有两种可能,因此称为二进制数(Binary digit),bit就是Binary digit得缩写。8位构成1字节(Byte)。有符号和无符号整数之间的区别在于怎样解释整数对应于内存中的二进制数的最高位。对于无符号数,其最高位被C编译器解释为数据位。而对于有符号数,C编译器将其最高位解释为符号位,若符号位为0,表示该数为正数;若符号位为1,表示该数为负数。对于计算机硬件而言,是没有数据类型的概念的,它更不区分内存中的二进制数那些是有符号数,那些是无符号数。可以说是,你把它看成什么,它就是什么。例如,你把它的最高位看作符号位,它就是一个有符号数;你把它的最高位看作数据位,那么它就是一个无符号数。

对于具有相同字节数的整数而言,因为有符号数的数据位比无符号数的数据位少了一位,且少的这一位恰好是最高位,因此有符号整数中的最大数的绝对值仅为最大无符号整数的一半。比如,假设编译系统为int性数分配2字节的存储空间,即16个二进制位中的最高位是符号位,以32767为例,其内存中的存储方式如下:

5042d5c5b15290402cb726b807943cf4.png

如果该数被定义为无符号整型,则将其最高位置为1后,该数变成65535;而要是该数被定义为有符号数,则将其最高位置为1后,该数将被解释为-1.

为什么解释成-1呢?

答:在计算机内存中,负数是以二进制补码形式表示和存放。

为什么要使用补码?

原因分两方面:一方面可以将减法运算变成加法运算来处理问题;

另一方面可以对0这个数形成统一的表示。

补码

在保持符号位不变的情况下,将负数的原码中得的1变成0、0变成1,得到的就是该负数的反码。负数的补码就是,在保持符号位不变的情况下,先求得求其反码,然后再将其结果加1。

正数的反码、补码亦如此。

8c70e2ac0dc631a87010881c8d29ba36.png

由于-1的二进制补码全为1,因此若将最高位的1解释为符号位(有符号数),则这个数就是-1;若将最高位的1解释为数据位(无符号数),则这个数就是65535.

为什么用补码可以统一的形式来表示0,并且可以将减法运算变成加法运算?

对于双字节整型数,+0的源代码都是0000 0000 、0000 0000,-0的原码为1000 0000 0000

0000,其反码为1111 1111 1111 1111,将这个反码加1后得到0000 0000 0000 0000(其中舍掉了最高位的进位),显然,+0和-0的补码是相同的,即0的表示是唯一的,而+0和-0

的原码却是截然不同的,也就是0的原码表示是不唯一的。

99f34e165355836cea93b3bc5ba0d29b.png

二、运算符

C语言既具有高级语言的特点,又具有低级语言的功能,如支持位运算就是这种特点的具体表现。这是因为,C语言最初是为取代汇编语言设计系统而设计,因此它必须支持位运算等汇编操作。位运算是对字节或二进制数位进行测试、抽取、设置或移位等操作。操作对象不能是float和double等其他复杂的数据类型,只能是标准的char和int数据类型。

位运算符:

2bf6d94595fced6b924e7d52de9c6044.png

位运算符的运算规则:

e5ef0329c030cd813a61c93576d8be8b.png

(1)按位与:

当两个操作数中的任意一位为0时,按位与后面的对应位将被置为0,常用于对字节中某位清0。例如,6&2,均以补码运行结果如下:

ce10daf143e061eb854f79a1503c00a7.png

二进制中均是二进制的补码

(2)按位或:

当两个操作数中的任意一位为1时,按位或后的对应位将被置为1。例如:

15|127的结果是只保留15的最高位不变,而其余位置均值为1,即

82c1681a951326f7bb5a7b645b866c9b.png

二进制中均是二进制的补码

(3)按位异或:

若两个操作的某位对应位不同,则异或后的对应位为1。例如6^2运算结果如下:

6b3de364065904d091191a09a6366bf3.png

二进制中均是二进制的补码

(4)按位取反:

对操作数的各位取反,即1——>0,0——>1。例如,~5的运算过程

766b55bfaad5ab3c8ab679d87294041f.png

二进制中均是二进制的补码

按位取反操作可应用于文件加密。

(5)左移位:

X<

例如,12及其左移1位、2位、3位的二进制补码分别表示如下:

50d5163f1f5f82a469b7fe35387db93c.png

编程提示:通过上面的数据可以发现这样一个结论:X的每位向左平移n位,对应的十进制得到的结果初始十进制值乘以2的n次方。

(6)右移位:

X>>n表示把X的每一位向右移n位。当X为有符号数时,左边空位补符号位上的值,称为算数移位;当X为无符号数时,左边空位补0,称为逻辑移位。

例如,12及其右移1位、2位、3位、4位的二进制补码分别表示如下:

95aa26b20ada96fe7cda2c4a5de42fc7.png
9c78c93221e2dbc90c0be4fc1813ffdc.png

注意:无论左移位还是右移位,从一端移走的位不移入另一端,移出的位信息都会丢失

持续更新中……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值