目录
计算机中的数据以二进制的形式存储在寄存器或存储器中。
机器怎么知道这些数据是定点数还是浮点数? 如果是定点数,是有符号数还是无符号数?
事实上,汇编语言中的数据类型取决于指令操作码。 存储在寄存器、存储器中的操作数本身没有数据类型,对该数进行何种数据类型的操作完全取决于指令。同一个操作数,既可以当作有符号数,也可以当作无符号数;既可以是定点数,也可以是浮点数。
高级语言具有数据类型,下面以C语言为例子介绍。
C语言中整型变量的取值范围:
以char(8位)型变量为例
无论是无符号数还是有符号数,C语言程序并不检测数据在加、减、乘等运算中产生的溢出现象。程序员应尽量避免出现这种情况,所编制的应用程序应具有对溢出进行判断的功能。
C语言中不同类型的数据可以互相进行强制类型转换。基本转换原则是尽量保持数的真值不变。
C语言中数据类型转换包括:
char、short、int、long 这4种整型数据的表示范围不一样,很可能数据转换后精度缺失,此时就只能尽量保持转换前后的机器码相同或机器码部分相同。
C语言中整型数据的转换包括:
以char类型为例:
有如下C语言程序段:
short si = -32767;
unsigned short usi = si;
执行上述两条语句后,usi的值为(D)。
A. -32767 B. 32767 C. 32768 D. 32769
【2019年题13】考虑以下C语言代码:
unsigned short usi = 65535;
short si = usi;
执行上述程序段后,si的值为(A)。
A. -1 B.-32767 C.-32768 D.-65535
【2012年题13】假定编译器规定int和short类型长度分别为32位和16位,执行下列c语言语句
unsigned short x = 65530;
unsigned int y = x;
得到y的机器数为(B)。 A. 0000 7FFAH B. 0000 FFFAH C.FFFF 7FFAH D. FFFF FFFAH
一般情况下:编译器会将机器码截短处理
整型数据之间的转换对比总结:
int、float、double之间也可以进行强制类型转换。 上述3种类型数据的机器码并不相同(int型数据是32位有符号整数,用补码表示;float和double型数据分别是32位和64位浮点数,它们的阶码用移码表示、尾数用原码表示)。 上述3种类型数据的表示范围和精度也不相同。 因此在转换过程中编译器只能保证数值尽量相等,大多数情况下只是近似值。下面,我们讨论以下几种转换情况。
float->double, double->float, float/double->int, int->float,int->double
由于double型数据的阶码和尾数的位数都比float型大,因此其表示范围更大、精度更高,转换后的double型数据与原float型数据的值完全相等。
两种类型都是32位,各自的数据组合(状态)数量相同,但二者在数轴上表示的数据并不完全重叠。 由于float型浮点数的尾数包括隐藏位在内共24位,当int型数据的高8位(24~31位)数据为非0时,无法精确转换成24位浮点数的尾数,此时发生精度溢出。
double型数据的尾数包含隐藏位在内有53位,可以精确表示所有32位整数。
总结: