数据的机器级表示与处理(C语言的运算)

高级语言程序中涉及的运算(以C语言为例)
整数算术运算、浮点数算术运算
按位、逻辑、移位、位扩展和位截断
指令集中涉及到的运算
涉及到的定点数运算
算术运算
带符号整数运算:取负 / 符号扩展 / 加 / 减 / 乘 / 除  / 算术移位
无符号整数运算:0扩展 / 加 / 减 / 乘 / 除 
逻辑运算
逻辑操作:与 / 或 / 非 / …
移位操作:逻辑左移 / 逻辑右移
涉及到的浮点数运算:加、减、乘、除

基本运算部件ALU的设计

算术运算(最基本的运算)
无符号数、带符号整数、浮点数的+、-、*、/ 运算等
按位运算
用途
对位串实现“掩码”(mask)操作或相应的其他处理
(主要用于对多媒体数据或状态/控制信息进行处理)
操作
按位或:“|” 
按位与:“&”
按位取反:“~”
按位异或:“^”
问题:如何从16位采样数据y中提取高位字节,并使低字节为0?
可用“&”实现“掩码”操作:y & 0xFF00

例如,当y=0x2C0B时,得到结果为:0x2C00

逻辑运算
用途
用于关系表达式的运算
例如,if (x>y and i<100)then ……中的“and”运算
操作
“‖”表示“OR”运算
“&&”表示“AND”运算
       例如, if ((x>y) && (i<100)) then ……
“!”表示“NOT”运算 
与按位运算的差别
符号表示不同:& ~ && ;| ~ ‖; ……
运算过程不同:按位 ~ 整体

结果类型不同:位串 ~ 逻辑值

移位运算
用途
提取部分信息
扩大或缩小数值的2、4、8…倍
操作
左移::x<>k
不区分是逻辑移位还是算术移位,由x的类型确定
无符号数:逻辑左移、逻辑右移
高(低)位移出,低(高)位补0,可能溢出!
问题:何时可能发生溢出?如何判断溢出?
          若高位移出的是1,则左移时发生溢出
带符号整数:算术左移、算术右移
左移:高位移出,低位补0。可能溢出!
       溢出判断:若移出的位不等于新的符号位,则溢出。

右移:低位移出,高位补符,可能发生有效数据丢失。

位扩展和位截断运算
用途
类型转换时可能需要数据扩展或截断
操作
没有专门操作运算符,根据类型转换前后数据长短确定是扩展还是截断
扩展:短转长
       无符号数:0扩展,前面补0 
       带符号整数:符号扩展,前面补符
截断:长转短
      强行将高位丢弃,故可能发生“溢出”
例1(扩展操作):在大端机上输出si, usi, i, ui的十进制和十六进制值是什么?
short  si = -32768;
unsigned short  usi = si;
int  i = si;

unsingned  ui = usi ;

总结:C语言程序中的基本数据类型及其基本运算类型
基本数据类型
无符号数、带符号整数、浮点数、位串、字符(串)
基本运算类型

算术、按位、逻辑、移位、扩展和截断、匹配

计算机如何实现高级语言程序中的运算?
将各类表达式编译(转换)为指令序列

计算机直接执行指令来完成运算

例:C语言赋值语句“f = (g+h) – (i+j);”中变量i、j、f、g、h由编译器分别分配给MIPS寄存器$t0~$t4。寄存器$t0~$t7的编号对应8~15,上述程序段对应的MIPS机器代码和汇编表示(#后为注释)如下:
000000 01011 01100 01101 00000 100000   add $t5, $t3, $t4   # g+h
000000 01000 01001 01110 00000 100000  add $t6, $t0, $t1   # i+j
000000 01101 01110 01010 00000 100010  sub $t2, $t5, $t6   # f =(g+h)–(i+j)

你可能感兴趣的:(数据的机器级表示与处理(C语言的运算))