C语言复习第一天(上篇)
基本数据类型和变量
1、什么是数据类型?
数据类型可以理解为固定内存大小的别名。对不同定义的变量的分配内存,并以对应的内存存储形式存放。
2、什么是变量?
变量可以理解为实际存储空间的别名。
实际程序通过变量来申请并命名存储空间。
使用变量可以使用存储空间
3、数据类型和变量:
数据类型确定申请内存空间的大小以及数据在内存中存储形式,而变量 的作用即是确定具体某块可用的内存。
char 类型
char类型为字符型变量,按照ascill码表将字符以二进制的形式存放在内存中,大小为一个字节(8位)。
#include <stdio.h>
int main()
{
char a='a';
printf("sizeof(char)=%d \n",sizeof(char));
printf("sizeof(a)=%d\n",sizeof(a));
printf(" a=%d\n",a);
printf(" a=%c\n",a);
}
运行的结果为:
short 类型
short类型短整型变量,内存大小为两字节。
#include <stdio.h>
int main()
{
short a=123;
printf("sizeof(short)=%d \n",sizeof(short));
printf("sizeof(a)=%d\n",sizeof(a));
printf(" a=%d\n",a);
}
int 类型
int类型短整型变量,内存大小为四字节。
#include <stdio.h>
int main()
{
int a=123;
printf("sizeof(int)=%d \n",sizeof(int));
printf("sizeof(a)=%d\n",sizeof(a));
printf(" a=%d\n",a);
}
float 类型
float类型数据在内存占四个字节,但是其在内存中存储数据的方式与整形不同,具体方式后面章节会详细介绍。
#include <stdio.h>
int main()
{
float a=12.3;
printf("sizeof(int)=%d \n",sizeof(int));
printf("sizeof(a)=%d\n",sizeof(a));
printf(" a=%f\n",a);
}
定义自己的数据类型(typedef,struct)
通过 typedef 可以为已有的数据结果名一个我们习惯的别名,同时struct可以定义我们自己的数据类型。
#include <stdio.h>
typedef int INT32;
typedef short INT16;
typedef struct ts
{
INT32 a;
INT16 b;
short c;
}my_ts;
int main()
{
my_ts m_ts;
printf("sizeof(my_ts)=%d \n",sizeof(my_ts));
printf("sizeof(m_ts)=%d\n",sizeof(m_ts));
}
运行的结果:4+2+2=8
有符号和无符号
计算机中的符号位
数据类型的最高位用于表示数据的符号
最高位1 表示正数
最高位0 表示负数
下面编程举例:
使用0x80,0x8000,0x80000000与变量相与,转化二进制即最高位为1,其余全为0,1与任何数相与还是原数,即可测试出最高位。
#include <stdio.h>
int main()
{
char a=100;
short s=-20;
int b=-100;
printf("%d\n",((a&0x80)!=0));
printf("%d\n",((s&0x8000)!=0));
printf("%d\n",((a&0x80000000)!=0));
}
有符号数的表示方法
在计算机的内部用补码表示有符号数。
正数的补码还是正数。
负数的补码为绝对值的二进制取反+1
8位 正数5的补码为 00000101
8位 负数-5的补码为 11111011
16位 正数20的补码 000 0000 0011 0100
16位 负数-20的补码1111 1111 1110 1100
大家可以用计算器验证:
无符号数的表示方法
1、计算机中用原码表示无符号数
无符号数默认为正数
无符号数没有符号位。
2、对于长度固定的无符号数
最大数+1=最小数
最小数-1=最大数
signed和unsigned
c语言中用signed 和 unsigned来定义有符号数 和无符号数
unsigned 用来定义无符号类型,不写默认为有符号。
tips:C语言中只有*整形*和*char类型*才有无符号类型
**小数类型**不能定义无符号。
当无符号数遇到有符号数
代码举例:无符号数和有符号相遇,会被同化为无符号数。
代码分析:因为无符号数和有符号数相加会被隐式规则默认同化为无符号。所以原先-5在计算机存放的值为1111 1111 1111 1011,被同化为有符号数则为1111 1111 1111 1011=一个很大数,所以大于0.
#include <stdio.h>
int main()
{
unsigned int i = 5;
int j = -10;
if( (i + j) > 0 )
{
printf("i + j > 0\n");
}
else
{
printf("i + j <= 0\n");
}
return 0;
}
错误使用unsigned
因为无符号存储的特性而错误使用:
最大值+1=最小值
最小值-1=最大值
#include <stdio.h>
int main()
{
unsigned int i = 0;
for(i=9; i>=0; i--)
{
printf("i = %u\n", i);
}
return 0;
}