2019西邮LINUX小组纳新题

1.考察usigned和补码,反码等。

int main(int argc, char *argv[]) {
for (unsigned int i = 3; i >= 0; i--)
putchar('=');
}

这个代码会输出无限个=。

#include
int main(int argc, char *argv[]) {
unsigned int i =3;
printf("%u\n",--i);
printf("%u\n",--i);
printf("%u\n",--i);
printf("%u\n",--i);
return 0;
}

当打印第四个i时,会输出4294967295。

对于正数,它的补码就是其原码(原码、反码、补码都相同);负数的补码是其反码加 1。例如short a = 6;,a 的原码、反码、补码都是0000 0000 0000 0110;更改 a 的值a = -18;,此时 a 的补码是1111 1111 1110 1110

可以认为,补码是在反码的基础上打了一个补丁,进行了一下修正,所以叫“补码”。

原码、反码、补码的概念只对负数有实际意义,对于正数,它们都一样。

此时我们进行进制换算看看具体情况

#include
int main()
{
    unsigned int b;
	int i,c=0,a[30];
	scanf("%d",&b);
	while(b!=0)
	{
		i=b%2;
		a[c]=i;
		c++;
		b=b/2;
	}
	c--;//因为c代表存入数据的长度而下表范围是0~c-1
	for(;c>=0;c--)//倒序输出即为这个数字对应的二进制
	{
		printf("%d",a[c]);	
	}
	printf("\n");
	return 0;
}

输入-1和4294967295

-1
11111111111111111111111111111111

4294967295

11111111111111111111111111111111

2.考察异或运算

/* (1) */ int c = a; a = b; b = c;
/* (2) */ a = a - b; b = b + a; a = b - a;
/* (3) */ a ^= b; b ^= a; a ^= b;

前两种非常的常规,第三种用到了异或运算a⊕b = (¬a ∧ b) ∨ (a ∧¬b)

异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),通过相同位的加法也可以得出。

3.考察static

void f() {
static int a = 0;
int b = 0;
printf("%d, %d\n", ++a, ++b);
}

static局部变量在所处模块在初次运行时进行初始化工作, 且只操作一次

在第二次调用进入时, 能保持第一次调用退出时的值

具体看static用法小结_Kendiv's Box-CSDN博客_static用法

4.考察printf的返回值

int main(void) {

printf("%d\n", printf("Xiyou Linux Group2%d", printf("")));}

输出结果为

Xiyou Linux Group2019,为什么结果会是这样呢?

原因为printf有返回值,它返回值是是什么?

返回值是输出长度。

所以先打印Xiyou Linux Group20

其次再打印Xiyou Linux Group2019.

9.

scanf读入遇到空格的时候会停止,所以只会读如LINUX。

所以想要读取全部内容需要使用gets或者scanf("%[a-zA-Z0-9]", str);我的第一篇博客里有说明。

13.

#include 
int main(){
    union{
        int n;
        char ch;
    } data;

    data.n = 0x00000001;  //也可以直接写作 data.n = 1;
    if(data.ch == 1){
        printf("Little-endian\n");
    }else{
        printf("Big-endian\n");
    }
    return 0;
}

大端模式(Big-endian)是指将数据的低位(比如 1234 中的 34 就是低位)放在内存的高地址上,而数据的高位(比如 1234 中的 12 就是高位)放在内存的低地址上。这种存储模式有点儿类似于把数据当作字符串顺序处理,地址由小到大增加,而数据从高位往低位存放。

内存地址 0x4000 0x4001 0x4002 0x4003
存放内容 0x78 0x56 0x34 0x12

小端模式(Little-endian)是指将数据的低位放在内存的低地址上,而数据的高位放在内存的高地址上。这种存储模式将地址的高低和数据的大小结合起来,高地址存放数值较大的部分,低地址存放数值较小的部分,这和我们的思维习惯是一致,比较容易理解。

内存地址 0x4000 0x4001 0x4002 0x4003
存放内容 0x78 0x56 0x34 0x12

你可能感兴趣的:(c语言)