寒假提升(6)[杂烩典型题]

天可补,海可填,南山可移。 日月既往,不可复追。 ——曾国藩


1、关于整形提升

char a=101;
int sum=200;
a+=27;
sum+=a;
printf("%d\n",sum);

这段代码的结果是什么呢?
首先关于char,存储的时候是是一个字节,意味着的是最高只能是2的7次方-1。为什么是7次方呢?
因为char是有符号的类型,符号位占了一个字节,也就还剩下127为最高,最小为-128。
此外,127和-128其实是连在一起的,意思是,对于char或者是别的一些有符号的类型也相当于是这样的,从0开始一直加1,能到127,在加上1就会变成-128,然后再加,最后又到0。
所以,a=101加上27,变成的是相当于-128,存储方式是1000 0000作为补码存储再内存中,符号位是1。但是在和int类型的sum进行计算时会整型提升(可以点进去看看,里面有相关介绍),此时由于最高位置是1,所以高位补1,然后再取反+1。为-128,所以sum+=a为sum=200-128=72。

2、大小端

关于大小端的判断方法,有两种。
一种是地址的强制转换,反正强制转换的话,会从低地址来取地址。
还有一种方法就是,利用联合体,利用它的存储的特点来判断。
关于细节和实现的操作,这里有,请点击
那么,这样的话,知道了大小端,这题应该会好些点。

int value = 1024;
char condition = *((char*)(&value));
if(condition) value += 1; condition = *((char*)(&value));
if(condition) value += 1; condition = *((char*)(&value));
printf("%d %d", value, condition);

问:最后的结果是什么?
1024的二进制是:0000 0000 0000 0000 0000 0100 0000 0000
注意: * ((char * )(&value)),这句话的意思是获得value低地址的8为数据,若数据是采用大端存储方式,则低地址对应的是数据的高位,即最左边的8位0,则condition=0,不执行两个if语句,则value不变,还是1024;若数据是采用小端存储方式,则低地址对应的是数据的低位,即最右边的8位0,则
condition=0,不管是大段还是小段,结果都是一样的,都是取全部是0。

3、使用函数时参数的影响

3、1、计算大小(有函数存在)

void func(char para[100])
{
void *p = malloc(100);
printf("%d, %d\n", sizeof(para), sizeof(p));
}

此时,printf的结果是什么呢?
对于char para[100],来说,传到函数中的时候已经发生了改变,传参的时候也只是会传首元素的地址。所以在计算的时候,两个的结果都是4(32位下的指针的大小)。

3、2、计算大小(无函数存在)

在64位操作系统上,下面程序返回结果是?

int main()
{
int *k[10][30];
printf("%d\n", sizeof(k));
return 0;
}

此时的大小不再指的是指针,因为这个结构,是指针数组,那么计算的就是这个数组的大小,然后呢,数组中存储的是指针,再64位上,指针的大小是8个字节,然后这个函数指针,存储了300个指针,所以结果是2400个字节。

3、3、形参和实参

#include <stdio.h>
void func(char *p) { p = p + 1; }
int main()
{
char s[] = {'1', '2', '3', '4'};
func(s);
printf("%c", *s);
return 0;
}

==在调用的时候,创建的只是形参,形参对于原来的实参的拷贝,在函数中的参数,他们的生命周期只会在函数中,离开函数,就会销毁。==所以,p的改变不会对s的指向没有什么影响。这和链表中还是有区别的。

4、关于赋值

若有定义语句: char s[3][10],(*k)[3],*p; 则以下赋值语句错误的是?
1.p = s;
2.p = k;
3.p = s[0];
4.k = s;

下面哪些是错的?
在没有强制类型转换的情况下,只有类型完全相同的指针才能相互赋值。

char s[3][10]中s运算时会退化为数组指针,类型是char ( * ) [10]。

char ( * k)[3]很明显k就是一个数组指针,类型也为 char (*)[3]

char * p类型为char * 指针

s[0]代表二维数组第一行,此时运算时,会退化成为第一行的首元素的地址。
所欲对于答案来说,答案是124。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值