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;
}
比如-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。