c语言进阶1(针对具体例题剖析)

例题1

编写程序,判断电脑是小端字节序存储还是大端字节序存储。

题目解析

首先要明确什么是大\小端字节序存储。

字节序:以字节为单位,讨论存储顺序。而内存中存储的整数为补码,16进制存储,2个16进制的数字为一个字节,整数4个字节需要8个16进制的数字。例如:int a=1的补码16进制形式为:00000001,即在内存中存储的就为00 00 00 01这几个数,但问题来了这几个数是怎么存储?这就需要提一提大\小端字节序存储了。

大端字节序存储:把一个数据的低位字节内容存放在高地址处,把一个数据的高位字节内容存放在低地址处;

小端字节序存储:把一个数据的高位字节内容存放在高地址处,把一个数据的低位字节内容存放在低地址处;

对于int a=1:

                     

而判断的时候我们也只需要判断第一个字节的内容为1还是0,若为1(01)则为小端,为0(00)则为大端。如何取出第一个字节内容?(int *)&a 取的是4个字节,而我们只需要强制转化为char*类型取的就是第一个字节,最后再解引用即可访问第一个字节的内容了。

代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 1;
	char* p = (char*)&a; //强制转化
	if (*p == 1)  //访问第一个字节内容
		printf("小端");
	else
		printf("大端");

结果

例题2

 题目解析

分析a:a为字符类型且在vs下默认为有符号字符类型。-1的二进制补码为:1111111111111111111111,而char类型为1个字节,发生截断为:11111111。结果最终是以%d形式输出,发生整型提升有符号的整型提升原则为最高位是什么补齐就补什么。11111111整型提升后为1111111111111111111111111111111,这是补码形式,原码为:100000000000000000000000000001,所以结果为:-1;

分析b:b为有符号字符类型,分析过程与a完全一样,结果为:-1;

分析c:c为无符号字符类型,-1的二进制补码为:1111111111111111111111,而char类型为1个字节,发生截断为:11111111。结果最终是以%d形式输出,发生整型提升无符号的整型提升原则为全补齐为0。11111111整型提升后为0000000000000000000000011111111,正数补码与原码一样,所以结果为255。

结果

例题3

 

题目解析

a为字符类型,a的二进制补码为:1111111111111111111111110000000,而char类型为1个字节,发生截断为:10000000。结果以%u无符号整型输出,发生整型提升,11111111111111111111111110000000,无符号输出时,结果为:4294967168

结果

例题4

题目解析

a为字符类型,a的二进制补码为:00000000000000000000000010000000,而char类型为1个字节,发生截断为:10000000。结果以%u无符号整型输出,发生整型提升,11111111111111111111111110000000,无符号输出时,结果为:4294967168

结果

 例题5

题目解析

i为有符号整型,i的二进制补码为:11111111111111111111111111101100,j为无符号整型,j的二进制补码为:0000000000000000000000000000001010。i+j的二进制补码为:111111111111111111111111111110110,原码为:1000000000000000000000000001010,结果为:-10。

结果

例题6

题目解析

当i=9时,i>=0,输出9;i=9-1=8时,i>=0,输出8;......;i=0时,i>=0,输出0;i=0-1=-1时,有些小伙伴会觉得-1>=0不满足,结束循环,这种情况是针对有符号整型的情况下,而题上是无符号整型,i=-1时,它的无符号结果i=4294967295;i=-1-1=2时,它的无符号结果i=4294967294,......

结果

例题7

题目解析

首先需要明确有符号char整型的范围:

范围为:-128-127;

数组结果为:

-1,-2, ...,-128,127,126,...,0

 -1,-2, ...,-128,127,126,...,0

-1,-2, ...,-128,127,126,...,0......

strlen()计算字符串的长度,遇到\0停止计算,即遇到0时停止计算,所以结果为:128+127=255。

结果

例题8

题目解析

首先需要明确无符号char整型的范围:

范围为:0-255,结果不会超过255,所以会一直死循环打印。

结果

结束语

时间有限,目前只整理了有关内存存储例题,后续会持续整理的!!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ambition…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值