1、使用一个4个字节的位结构体保存年月日3个字段;

1、使用一个4个字节的位结构体保存年月日3个字段;
struct SDate
{
unsigned int nYear;
unsigned int nMonth;
unsigned int nDay;
};

2、输入中输入年月日,传递一个函数打印是当年中的第几天。
尽量用4个字节保存3项日期数据。

#include <stdio.h>
struct sData
{
	unsigned int nYear : 20;
	unsigned int nMonth : 4;
	unsigned int nDay : 8;
};

void Input(sData* p)
{
	
	unsigned int nYear1;
	unsigned int nMonth1;
	unsigned int nDay1;
	printf("请输入如年月日:");
	//scanf_s("%d%d%d",&p->nYear,&p->nMonth,&p->nDay);
	scanf_s("%d%d%d", &nYear1, &nMonth1, &nDay1);
	sData a = { nYear1,nMonth1,nDay1 };
	*p = a;
}
//计算是每年的第几天
void Calculate(sData* p)
{
	unsigned int nList[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	unsigned int day = p->nDay;
	//int i = 0;
	当你输入1月时,不进入循环
	//while (++i < (int)(p->nMonth))
	//{
	//	day += nList[i - 1];
	//}
	int i = -1;
	//当你输入1月时,不进入循环
	while (++i < (int)(p->nMonth) - 1)
	{
		day += nList[i];
	}

	if (p->nMonth > 2)
		day += (unsigned int)(p->nYear % 4 == 0 && p->nYear % 100 || p->nYear % 400 == 0);
		//100年不闰,400年再润。举例1900
	printf("%d年%d月%d日是一年中的第%d天\n", p->nYear, p->nMonth, p->nDay, day);
}

int main()
{
	sData d;
	Input(&d);
	Calculate(&d);
	return 0;
}

12.drawio.png

比如-128: 绝对值减一,是 127 = 0111 1111。 再取反,这就是:[-128]补 = 1000 0000。

假如一个有符号数只有4位(-8到7),7+1计算机底层是补码+1,也就是说是0111 + 1 = 1000,按照上面1000求得原码就是-8

假如一个有符号数只有4位(-8到7),7+1计算机底层是补码+1,也就是说是0111 + 1 = 1000,按照上面1000求得原码就是-8

对于一个无符号数只有4位(0到15) ,15+1计算机层是补码+1,1111 + 1。溢出了就是0。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值