记录自己笔试中遇到的C/C++中没有搞懂的地方,也给大家提个醒。

1、Unsigned+signed相加

题目如下:

int main()

{

  unsigned int x=9;

  int y=-20;

  int m=(x+y)>9)?1:0 ;

  return 0;
}

m是多少?

解答:m=1.

在32机器上,unsigned int 最大是2^32-1,int的最大值是2^31-1,当Unsigned+signed相加时,signed转化为Unsigned,-20转化为Unsigned是一个很大的正整数因为最高位是1,所以x+y必然大于9.

 

2、逗号表达式

x=(y=1,z=2,k=3)问x=?

解答:x=3.

逗号运算符的优先级是15级,左结合,其作用是用逗号将两个表达式连接起来。
逗号运算符的一般形式是:表达式1,表达式2
逗号运算符的求解过程是:先邱表达式1,再求表达式2,整个表达式的值是表达式2的值。

奶奶的,这个我做错了,我写成了x=1。以为是先算右边的复制语句,整个结果是左边的值。此题是南京三星2011第一轮笔试的选择题。

 

 3、位域

 
  struct test1
  {
  char a:1;
  char :2;
  long b:3;
  char c:2;
  };
  sizeof(test1)=?

解答: sizeof(test1)=12

解释如下:
  首先以最长的类型位宽做为偏移量,最长的是long型,占4位,所以不同类型之间应该是4个字节的偏移,即test1应该是4字节的整数倍。
  char a:1; //用一个字节去存储
  char :2;  //空域。因为与前面的a的类型相同,而两个位域的位宽相加仍然少于8位,所以依然用1个字节表示
  long b:3; //long类型的位宽是4个字节,与前面的char类型不同,所以b与a之间偏移4个字节,它们之间自动补充3个字节
  char c:2; //因为c与b又不同型,以test1中的最长的long类型的位宽进行偏移,所以虽然char只用1个字节就够了
  //但依然要占4个字节。
  总共是12字节。

 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

   而使用位域的主要目的是压缩存储,减少内存的占有量,其大致规则为:
  1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
  2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
  3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
  4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
  5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。

 

----------------------------------

后记,此贴我会陆续更新,记录下自己笔试中的只是误区。

有错误,请指出。感谢大家。

 

posted on 2010-09-10 21:01  gumarco  阅读(413)  评论(5编辑  收藏  举报