c基础4(溢出、随机数、十进制转其他进制)

一、溢出

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 +  10); // 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);

 

你可能感兴趣的:(随机数)