程序员视角的计算机系统 2.2.5 在C语言中的有符号与无符号
C中默认为有符号数,如果在结尾加上U,u则被视为无符号数。C允许 在有符号与无符号之间
转换。规则是二进制的表示是不变的。
在显式的映射的情况下,转换能发生,例如如下的代码:
1 int tx,ty;
2 unsigned ux,uy;
3
4 tx=(int) ux;
5 uy=(unsigned) ty;
还有,当 一个数据类型的表达式被赋值为其它类型的变量的值时,转换是隐式发生的。如下代码:
1 int tx,ty;
2 unsigned ux,uy;
3
4 tx= ux; /*映射为有符号数*/
5 uy= ty; /*映射为无符号数*/
当使用printf打印数值的值时,格式%d,%u,%x被用来相应地表示一个有符号的十进制,一个无符号
的十进制,和十六进制。考虑如下的代码:
1 int x=-1;
2 unsigned u=2147483648; /*这是2的31次幂*/
3
4 printf("x=%u=%d\n",x,x);
5 printf("u=%u=%d",u,u);
在一个32位长的机器上运行如上的代码,打印结果 如下:
x=4294967295=-1
u=2147483648=-2147483648
我们能看到转换的程序的动作如下:T2U32(-1)=UMax32=2^32-1
还有U2T32(2^31)=2^31-2^32=-2^31=TMin32.
这些微妙的行为的发生,归因于C对于包括了有符号与无符号的数的表达式的转换上的处理方式。
图2.18给出了一些例子:
练习问题2.21
假定在一个32位长的机器上评估表达式,使用2补码的算术,以图2.18为参照,填写下表的空白处。
表达式 类型 结果值
——————————————————————————————————
-2147483647-1==-2147483648U ____________ ____________
-2147483647-1<2147483647 ____________ ____________
-2147483647-1U<2147483647 ____________ ____________
-2147483647-1<-2147483647 ____________ ____________
-2147483647-1U<-2147483647 ____________ ____________