一、溢出
1.short类型
数据使用必须在范围内,否则无符号产生溢出,有符号出错。
1 print(
"
short极大值%d
",
"
short极小值
",SHRT_MAX,SHRT_MIN);
//
32767,-32767
2 print(
"
unsigned short极大值%d
",
"
unsigned short极小值
",USHRT_MAX,
0);
//
65535,0
3
4 unsigned
short num1=
65535+
2;
5 printf(
"
%d
",
sizeof(num));
//
2个字节
6 print(
"
%d
",num1);
//
num1=1,溢出
7
8
short num2=
32767+
1;
9 printf(
"
%d
",);
//
num2=-32768,出错
2.int类型
1).32位平台,%d能表示的范围就是int的范围,根据平台的不同,int的表示范围也不同,32位是4byte.
1 printf(
"
%d,%d
", INT_MAX, INT_MIN);
//
2147483647,-2147483648
2
//
前两个数越界,后一个正常
3 printf(
"
\n%d,%d,%u
", INT_MAX +
1, INT_MIN -
1, INT_MAX +
1);
//
-2147483648,2147483647,2147483648
4
//
UINT_MAX超过了%d所表示的范围
5 printf(
"
\n%d,%d
", UINT_MAX,
0);
//
-1,0
6
//
正常情况
7 printf(
"
\n%u,%d
", UINT_MAX,
0);
//
4294967295,0
8
//
UINT_MAX超过了%u所表示的范围
9 printf(
"
\n%u,%d
", UINT_MAX +
1,
0);
//
0,0
3.float类型
1).为什么int和float都是分配了4个字节,而两者的取值范围却不一样
因为int采用的是普通计数法,而float是科学计数法,故两者存储的格式不一样,float型的二进制里面有一部分表示的是指数。为何要采取指数,因为float型中两个数之间的数的个数是无穷无尽的,所以不能用普通计数法一一对应。
2).所占字节数
1 printf(
"
%d
",
sizeof(
1.0));
//
8
2 printf(
"
%d
",
sizeof(
1.0f));
//
4
3 printf(
"
%d
",
sizeof(
1u));
//
4(无符号整形)
3).示例.计算三角形的周长与面积
1
#define _CRT_SECURE_NO_WARNINGS
2 #include<stdio.h>
3 #include<math.h>
4
void main()
5 {
6
float a, b, c,s,p;
7 scanf(
"
%f%f%f
",&a,&b,&c);
8 p= (a + b + c) /
2;
9 s = sqrt(p*(p-a)*(p-b)*(p-c));
10 printf(
"
%f,%f
", p, s);
11 system(
"
pause
");//不用getchar()是因为回车也被当成一个字符
12 }
4.使用printf函数注意事项
1).printf的本质:不管什么类型,都按照自己的方式转换为字符串
1
int num1=
1;
2 printf(
"
%d
",num1);
//
1
3 printf(
"
%f
",num1);
//
0.000000
2).使用printf打印的时候必须要类型匹配,否则出错
1 printf(
"
%d,%u
",-
1,-
1);
//
-1,4294967295
2 printf("%x",-10);//fffffff6,无符号十六进制
3 printf("%o",-10);//37777777766,无符号八进制
二、随机数
1.rand()函数
1).rand函数是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。而使用同种子相同的数调用 rand()会导致相同的随机数序列被生成。
2).返回一个[0,RAND_MAX]间的随机整数。
如果程序被调用一次,则每次调用时产生的随机数相同。但是如果循环调用,产生的随机数不一样。
1
int num = rand();
2 printf(
"
%d\n
", num);
每次产生的随机数都是相同的(41).
1
for (size_t i =
0; i <
10; i++)
2 {
3
int num = rand();
4 printf(
"
%d\n
", num);
5 }
2).生成0~n的随机数 rand()%n
2.srand()函数
1).void srand(unsigned seed)参数seed是rand()的种子,用来初始化rand()的起始值。系统在调用rand()之前都会自动调用srand(),如果用户在rand()之前曾调用过srand()给参数seed指定了一个值,那么 rand()就会将seed的值作为产生伪随机数的初始值;而如果用户在rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始 值。如果给了一个定值,那么每次rand()产生的随机数序列都是一样的。
示例:
1 time_t time1;//定义时间类型的变量
2 srand((unsigned
int)time(&time1));//随机数发生器,根据时间,time(&time1)函数获取时间赋值给time1
3
int num=rand();
4 printf(
"
%d
",num);
2).生成100~200的随机数方法: rand()%100+100
字符常量、字符变量、字符串
1.c语言为了空间的扩展,字符常量4个字节,字符变量一个字节
1
char ch =
'
a
';
2 printf(
"
\n%d
",
sizeof(ch));
//
1
3
//
c语言为了空间的扩展,字符常量4个字节,字符变量一个字节
4 printf(
"
\n%d
",
sizeof(
'
a
'));
//
4
5 printf(
"
\n%d
",
sizeof(
'
abcd
'));
//
4
6 printf(
"
\n%d
",
sizeof(
'
abcde
'));
//
报错(字符常量的字符过多)
2.字符串以\0结尾
1 printf(
"
\n%d
",
sizeof(
"
a
"));
//
2
2 printf(
"
\n%d
",
sizeof(
"
abcde
"));
//
6
类型转换
1.隐式转换和强制转化
1).不同类型做运算时自动转换
2).赋值,自动转换
3).隐式转换:低字节向高字节转换
4).强制转换会丢失精度
2.案例:实现十分位6舍7入
1
float num;
2 scanf(
"
%f
", &num);
3 num = (
int)(num*
10+
0.3) /
10.0f;
4 printf(
"
%f
",num);
十进制转其他进制
1._itoa();
1
int num =
10;
2
char str[
20];
3 _itoa(num,str,
2);
4 printf(
"
%s
", str);
5 _itoa(num, str,
8);
6 printf(
"
%s
", str);
7 _itoa(num, str,
16);
8 printf(
"
%s
",str);