记录自己笔试中遇到的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) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
----------------------------------
后记,此贴我会陆续更新,记录下自己笔试中的只是误区。
有错误,请指出。感谢大家。