程序员视角的计算机系统 2.2.5 在C语言中的有符号与无符号

程序员视角的计算机系统 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.2.5 在C语言中的有符号与无符号
练习问题2.21
假定在一个32位长的机器上评估表达式,使用2补码的算术,以图2.18为参照,填写下表的空白处。

表达式                                                     类型                    结果值
——————————————————————————————————
-2147483647-1==-2147483648U        ____________           ____________
-2147483647-1<2147483647              ____________           ____________
-2147483647-1U<2147483647           ____________           ____________
-2147483647-1<-2147483647             ____________           ____________
-2147483647-1U<-2147483647          ____________           ____________

上一篇:UVA-10285-Longest Run on a Snowboard


下一篇:Codeforces Round #541 (Div. 2)F. Asya And Kittens(启发式合并+并查集+构造)