目录
1.有符号数与无符号数的表示
2.转换
3.拓展与截断
4.加法、移位
1.有符号数与无符号数的表示
●有符号数:第一位代表符号,1为负数,0为正数
●无符号数:没有符号代表正负。
●不同字长机器上的取值范围:‘’
UMax为无符号整数表示的最大值。
TMax、TMin分别表示有符号整数表示的最大值、最小值。
2.转换●转换:
有符号数正数与无符号数相等;有符号数负数转化为无符号数加上2^w即可(w为机器字长);反之即减去2^w。
●C语言中的有符号数与无符号数:
▲常数
缺省状态下是有符号数
无符号数在后面添加U
0U, 4294967259U
▲转换
显示转换:
int tx, ty;
unsigned ux, uy;
tx = (int) ux;
uy = (unsigned) ty;
隐式转换:
tx = ux;
uy = ty;
●例:某32位机器,考虑以下C代码:
int x = –1;
unsigned u = 2147483648;
printf ( “x = %u = %dn”, x, x);
printf ( “u = %u = %dn”, u, u);
在32位机器上运行上述代码时,它的输出结果是什么?为什么?
答:
x = 4294967295 = –1
u = 2147483648 = –2147483648
▲因为–1的补码整数表示为“11…1”,作为32位无符号数解释时,其值为2^32–1= 4 294 967 296–1 = 4 294 967 295。
▲2^31的无符号数表示为“100…0”,被解释为32位带符号整数时,其值为最小负数:–2^(32-1) = –2^31 = –2 147 483 648。
3.拓展与截断●拓展:将w位变成(w+k)位
无符号数直接补0,有符号数补符号位。
●截断:将w位变成(w-k)位
舍弃高位,保留低位
4.加法、移位●无符号数加法:
操作数为w位,结果本应用(w+1)位储存,需丢弃进位。
●有符号数加法:
也需丢弃符号位,结果小于可以表示的最小的数为负溢出,大于可以表示的最大的数为正溢出。
正溢出和负溢出都会改变结果的符号。
●用移位运算代替乘法:
左移x位相当于乘以2^w,右移x位相当于除以2^w、
●使用移位代替除法时:
无符号数采用逻辑移位(左边补0):
有符号数采用算术移位(正数补0,负数补1):



