C语言如何根据数据类型来处理不同的数据?
位指的是短小的二进制数字,是一个二进制的赋值变量。一个单一的位只能代表两个值所以我们要把他们组织到一起才能表示更广范围的数字。位的最常组织方式是字节,它是一个八位的位组数列。
正的值 0 0 0 0 0 1 1 1
当一个二进制不啊位模式数字在其最高位是一的时候,他所表达的就是一个负数为确定这个值我们进行相同的操作步骤
未知的值(-?) 1 1 1 1 1 0 0 1
所以未知的值就是负七
未知的值(-?) 1 0 0 0 0 0 0 0
10000000表示-128这个数被称为奇异数。所以二进数制补码位模式表达数的范围就是-128~27.
所有的位 1 8 23
符号 指数e 小数f
将这些位组织到一起后,有一些方法可以用来对他们进行解释。我们将每一种解释方法称为位模式。
1.纯数字位模式
最简单的位模式是用于非负整数的。即为我们所理解的普通的二进制表示数字那种,没有正负之分。
给定一个八位的位组,它能够存储的最大的整数位
2^8-1=256 范围是0~256,
具有2的最低次方的位被称为最小有效位(least significant bit)或最低位(lowest-order bit),相反具有2的最高次方的位称为最大有效位或最高位。
通过将4个字节组合在一起,则纯数字位模式就可以表示一个高至2^32-1=4294967295
c语言中,有几个数据类型使用了纯数字位模式,一个是unsigned char类型是一个1字节(8位)变量,数值范围0~256.在32位系统中,一个unsigned int类型是一个4字节变量,它能够表示0~4294967295.一个unsigned short int
2字节变量,表示0~656535.在技术上c语言并没有规定int类型的大小。
2.符号数字位
模式在想表达带有符号位模式的整数时,比较常见的方法是将最高位分配位符号位(sign bit)者称为符号位模式
符号位为0表示正数,1表示负数,
符号位模式有两个缺点。首先0可能有两个位值:00000000或10000000更重要的是使用符号数字位模式,使二进制的加法变得复杂了。由于者两个缺点,所以在c语言中没有数据类型使用符号数字模式。通常仅在简单的计算电路,或这些缺陷确定不会带来麻烦的设计问题中,才回看到符号数字位模式。
3.二进制补码位模式
使用二进制补码位模式,整数和零被解释成和纯数字位模式完全一样的结果,而负数的表达则需要通过以下几步
1. 列出用来表达该数整数的位
2.取反(反转)所有位
3.加一
拿-7举个栗子
正的值 0 0 0 0 0 1 1 1
取反所有的位 1 1 1 1 1 0 0 0
加一 1 1 1 1 1 0 0 1
当一个二进制不啊位模式数字在其最高位是一的时候,他所表达的就是一个负数为确定这个值我们进行相同的操作步骤
未知的值(-?) 1 1 1 1 1 0 0 1
取反所有位 0 0 0 0 0 1 1 0
加一 0 0 0 0 0 1 1 1
所以未知的值就是负七
二进制补码位模式位我们解决了纯数字位模式中的双零问题。用来表示零的唯一一种位排列方式就是00000000.
使用符号位模式,位的组合10000000表示负零,在二进制补码位模式中,它表达的是-128
未知的值(-?) 1 0 0 0 0 0 0 0
取反所有位 0 1 1 1 1 1 1 1
加一 1 0 0 0 0 0 0 0
10000000表示-128这个数被称为奇异数。所以二进数制补码位模式表达数的范围就是-128~27.
二进制补码位模式还是的实现加法和减法变得更加容易,因为,在不考虑两个输得符号的情况下,他们总是被相加,
由于有效位表达数值的范围是有限的,所以当两个数的和超出范围是就会出现算术溢出的问题。在计算机系统中,二进制位模式是用来表示符号整数的最常见模式
4.浮点位模式
为了存储实数我们可以使用能够定点位模式和浮点位模式两种。
定点位模式在小数部分中用来表达小数位的个数是固定的。我们认为这是一个限制,而且对位的使用也是有限的。
利用浮点位模式
这里我们用的是二进制中的科学技术法,即
18.375=10010.011=1.0010011x2^4
我们假定前导值是一,就可以简化对一个数的存储
浮点位模式是按照下面方式来存储数的
1.fx2^e
必须被存储的数就是用来表示符号的位,用来表示小数f的位以及用来表示指数e的位。其余可以使用的位可以在小数部分和指数部分进行分配。给定32位(4字节)标准就是使用23位来表达小数,8位来表示指数
所有的位 1 8 23
符号 指数e 小数f
位序 31 30…23 2…0
用于指数的8个位用来表达的范围是-127~128.在十进制中能够使用的所有精度在使用4字节浮点位模式是大约是8节。
可以使用一下步骤将一个数从十进制换成使用浮点位模式的二进制
1.写出符号位
2.按照定点二进制方式写出没有符号的数
3.规格化,将基点(十进制小数点)移至第一个1的后面
4.将f赋值位基点后面的部分,不足位补零。
5.将e赋值位给定的指数,通过+127改变它的值
举个栗子
-118.625
(1)s=1
(2)118.625=1110110.101
(3)1110110.101=1.110110101x2^6
(4)f=110 1101 0100 0000 0000 0000
(5)e=6+127=133=1000 0101
1 1000 0101 110 1101 0100 0000 0000 0000
指数通过加上127进行了改变,以便能够计算能够指数保存为一个纯数值,并且依旧表达-127~128之间的数,
在c语言中,数据类型float使用4个字节来存储一个实数,而数据类型double则使用8个字节来存储一个实数。double类型依旧使用1位表示符号,但它使用11位表示指数并使用52位来存储小数部分。能够表示更广范围内的数。
5.ASCll和Unicode位模式
为了表示非数值数据,就必须是使用另外一种位模式。ASCll(美国国家信息交换标准码)位模式就是位表示英语文本符号以及为了打印英语文本需要的控制字符而制定的。
在c语言中数据类型char 和unsigned char都使用了ASCll位模式
使用格式符%c函数,调用printf()将使用ASCll位模式来解释变量。使用格式符%d(或%i),函数调用printf()
将变量解释位为一个整数。对数据char而言printf()函数使用二进制补码位模式解释变量,而对unsigned char,printf()函数则使用纯数字位模式解释变量。