C语言复习 第一波 进制转换代码

xiaoxiao2021-02-28  143

1、进制问题(各进制之间的转换),注意,牵扯到位运算,都是基于二进制的,最好把位数写全。 %x:十六进制打印 例:0x78 x:十六进制八位打印 例:00000078 2、fopen和open的区别:fopen是C库函数中,open是系统调用。 3、处理数字:一般套路是:%n,/=n;      函数: 实现十进制向任意进制转换 #include<stdio.h> #include<string.h> #define SIZE 128 void reverse(char *arr,int len)//逆置函数 {      for(int i=0,j=len-1;i<len/2;++i,--j)      {            char tmp = arr[i];            arr[i] = arr[j];            arr[j] = tmp;      } } void itoa(int data,int radix,char *result)//转进制函数 {      int i = 0;      if(data > 0)      {            do            {                 int tmp = data % radix;                 if(tmp < 10) //小于10就用10表示                 {                      result[i++] = tmp + '0';                 }                 else //大于10就用abc字母表示                 {                      result[i++] = 'a' + (tmp-10);                 }                 data = data / radix;            }while(data != 0);            int len = strlen(result);            reverse(result,len);      }else      {            return;      } } int main() {      char result[SIZE] = {0};      int data = 0;      int radix = 0;      scanf("%d",&data);      scanf("%d",&radix);      itoa(data,radix,result);      printf("%s\n",result);      return 0; }      写一个判断是否是小写字母的函数 bool Myislower(char ch) {      int min = (int)('a');      int max = (int)('z');      if((int)ch>=min &&(int)ch<=max)      return true;      else            return false; } int main() {      printf("%d\n",Myislower('a')); //1      printf("%d\n",Myislower('A')); //0      return 0; } 4、运算符问题 (1)优先级问题 (2)、浮点数:位运算不适用,求余不适用,比较相等不适用。 (3)、0<a<2 永远为真 因为如果0<a为0为1都小于2 (4)、表达式1&&表达式2 : 1为假不看2             表达式1 || 表达式2:1为真不看2 5、类型转换:原则,窄 =》 宽;(默认相同类型下,无符号更宽) int main() {      unsigned short a = 10;      unsigned int b = 10;       if(a > -1)//整型起       {             printf("a>-1\n");       }       printf("a<-1\n");       if(b > -1)       {             printf("b>-1\n");       }       printf("b<-1\n");             return 0; } //结果:a>-1(10转成int,还是10,然后大于-1)              b<-1(-1转成int是好大的数字,所以肯定大于10) int main() {      char a = 100;      char b = -1;      char c = 200;      unsigned char d = 10;      unsigned char e = -1;      unsigned char f = 200;      int g = a;      printf("%d,%x\n",g,g);//100 64      g = b;      printf("%d,%x\n",g,g);//-1 ffffffff      g = c;      printf("%d,%x\n",g,g);//-56 ffffffc8 (200的二进制:11001000 因为是负数,所以取反加一)      g = d;      printf("%d,%x\n",g,g);//10  a      g = e;      printf("%d,%x\n",g,g);//255 ff(-1的二进制表示:11111111因为unsigned所以等于255)      g = f;      printf("%d,%x\n",g,g);//200 c8      return 0; } 类型转换一定要注意,如果是负数,就要取反加一得值。 5、基本语法 (1)、switch:case或者default进,break出 void Show(int a) {      switch(a)      {      default:            printf("other\n");      case 0:            printf("0\n");      case 4:            printf("4\n");      case 3:            printf("3\n");            break;      case 1:            printf("1\n");            break;      } } int main() {      Show(10);//other 0 4 3       return 0; } 六、指针和数组 int main() {//数组名表示整个数组:在定义数组的同一个函数中,sizeof(arr),&arr+1      int arr[10] = {1,2,3,4,5,6,7,8,9};      int *p = arr; //指针-指针      int *q = &arr[8];      printf("%d\n",p-q);//-8      printf("%d\n",q-p);//8      printf("%d\n",(short *)p-(short *)q);//-16   本来是 4*(-8) = -32位 然后short是2个字节 所以距离就是[-32/2=-16]      printf("%d\n",(double *)p-(double *)q);//-4  本来是 4*(-8) = -32位 然后double是8个字节 所以距离就是[-32/8=-4]      printf("%d\n",(unsigned long)q-(unsigned long)p);//32 p里存0号下标地址,q存8号下标地址,他俩差的就是4Byte*8=32      int *p1 = (int *)2000;//指针+-数字      printf("%d\n",p1+2);//2008  2000+2*4      printf("%d\n",(char *)p1+2);//2002   2000+2*1      printf("%d\n",(long long)p1+2);//2002  2000+2      printf("%d\n",(double **)p1+2);//2008 2000+2*4      //int *p = (int *)&arr + 1;//arr[1]      //int *q = (int *)(&arr+1);//arr[10]      //printf("%d,%d\n",p[2],q[-3]);//4,8    *(p+2)      //&arr+1      return 0; } 总结:关于指针的三个操作,指针+-数字,指针-指针,都要注意要计算指针的权重,即去掉星号求sizeof
转载请注明原文地址: https://www.6miu.com/read-39630.html

最新回复(0)