day01作业:
1、short 有符号和无符号的取值范围?
short 两个字节(16位)
无符号数
最小: 0000 0000 0000 0000 0
最大: 1111 1111 1111 1111 65535
注意:可以使用等比数列求和公式计算
有符号数
最小: 1111 1111 1111 1111 -32768
(负数的0人为定义为-32768)
最大: 0111 1111 1111 1111 32767
2、short b;b=50000;printf("%d\n",b); -----> -15536
分析过程如下:
32769 2 -32768+(2)-1 -32767
50000 50000-32767 -32768+(50000-32767)-1 -15536
3、计算sizeof(stu1)=44
struct stu2{
int a; 4
char c; 4
int b; 4
short e; 4 (sizeof(short)+2*sizeof(char))
char arr[5]; 4
};
struct stu1{
short e; 4
int f[10]; 40
struct stu2 stu;
};
4、端序问题(方式1 union 方式二 指针 (待续))
union test{
char a[4];
int i;
};
int checkCPU()
{
union test t;
t.i=0x12345678;//数据的低位
if(t.a[0]==0x78)
return 1;
else
return 0;
}
void main()
{
if(checkCPU()==1)
printf("小端对齐\n");//低地址对应低位
else
printf("大端对齐\n");//高地址对应低位
}
整数溢出补充
类比:溢出情况类似于汽车里程表,溢出之后返回起始点。
计算一个整数的时候超过该整数所能容纳的最大单位后,会发生溢出,高位舍弃(其实就是当一个较大的整数赋值给一个较小的整数)
unsinged short a=0xffff;
a=a+1;
//a=a+100
printf("%d\n",a);
当一个小的整数(负数)赋值给一个较大的整数时,符号位保留。
short ab=-2;
i=ab;
printf("%x\n",i);
unsigned short m_a=0;
m_a=m_a-1;
printf("%d\n",m_a);
char ch=-1;
printf("%x",ch);
字符型 char与 unsinged char
unsinged char ch=0;
ch-=1;
printf("%d\n",ch); //255
转义字符参照课件
浮点数 float(4) double(8)
浮点数的效率低,避免使用,内存中不是单纯的补码运算。
思考:比较两个浮点数的大小。
printf 使用方式参照课件
scanf
注意事项:
char arr[100]={0};
scanf("%s",arr);//输入一个字符串,以回车键,空格作为字符串结束标识
printf("%s",arr);
//注意缓冲区溢出
char s[10]={0};
scanf("%s",s); //--->输入asdffghhjjkk;lhjjjjj 会崩溃
//解决方式:调整数组的大小或者使用fgets(文件部分讲解)
char str[10]={0};
scanf("%s",str);//he ha hou
printf("%s",str);//输出he
//验证残留的信息ha hou是存在于stdin流中,而不是在键盘缓冲区中
char str[20];
char str1[20];
char str2[20];
scanf("%s",str);/*此处输入:he ha hou */
printf("%s",str);
scanf("%s",str1);/*无需再输入,对stdin流再扫描 */
scanf("%s",str2);/*无需再输入,对stdin流再扫描 */
printf("\n%s",str1);
printf("\n%s",str2);
//键盘缓冲区残余信息问题
int a;
char c;
scanf("%d",&a);
scanf("%c",&c);//认为回车作为输入了
printf("a=%d c=%c\n",a,c);
//解决方式1:getchar();
//解决方式2:fflush(stdin);
运算符 其余参照课件
++ --
分析: int i=5;
int a=i++ + ++i;
printf("%d\n",a); //a=12 不区分编译器
//分析:
//相当于
// i=i+1;
//int a=i+i;
//i=i+1;
//也可以这样理解,运算顺序是自右向左的,先计算++i,暂时不入栈,
//统一将所有++i计算完成后一起入栈,这里就是6先进栈,之后计算i++,先进行赋值,因此6也进栈了,之后i+1=7.
int a=++i + ++i;
//备注:以VS为基准。
int j=0;
int m=1;
j=(++m)+(++m)+(++m);
j=(++m)+(++m)+(m++);
j=(m++)+(m++)+(m++);
j=(m++)+(m++)+(++m);
//对于不同的编译器,同一行中出现了多次的++的行为不定, (++i)+(++i)+(++i)执行的顺序可能不同,不深究。
int a=++m;
int b=++m;
int c=++m;
j=a+b+c //j=9;
条件运算符
等价于if语句,参照课堂Code
逗号表达式 参照课堂Code
用法:先计算左边的值,在计算逗号右边的值,最后取右边的结果。