C语言数据类型、运算符优先级


C语言类型

  -运算符sizeof

  -整数

    char、short、int、long、long long

  -浮点数

    float、double、long double

  -逻辑

    bool

  -指针

  -自定义类型

 

运算符sizeof

   给出某个类型或者变量在内存中所占据的字节数

    如sizeof(int)  sizeof(a)

   sizeof是一个静态运算符,它的结果在编译时刻就决定了,因此不要再sizeof的括号里做运算,这些运算不会被执行

   例如:int a=6;

      int b=sizeof(a++);

      printf("%d",a)      //结果是6而不是7

 

整数类型

    char     1Byte

    short    2Byte

    int     取决于CPU和编译器,通常是一个字,表示一个寄存器的大小,通常4Byte

    long    取决于CPU和编译器,4Byte或者8Byte

    long long  8Byte

  以下是64位机执行结果

 

 

整数的内部表达

 

   负数在计算机内部是以补码的方式存在的,这样方便加法运算,减法运算可以直接转换为加法运算。

  实际运算的时候需要注意数据类型的范围,小心越界

整数的范围

  0000 0000 ~ 0111 1111  // 0~127

  1111 1111~1000 0000  //-1~-128

  char :  一个字节  -128~127

  short:  两个字节  -32768~32767

  int:   假如4字节  -2^32-1~2^(32-1)-1

无符号类型

  unsigned char/int/...      //二进制只表示0和正数,不表示负数

  如果一个字面常数想要表达自己是unsigned,可以在后面加上u或者U

  如果一个字面常数想要表达自己是long,可以在后面加上l或L

printf函数

  %d  比int小的类型用%b输出的时候会转换成int再输出

  %u  无符号类型

  %lld

  %lu

  0开头表示8进制

  0x开头表示16进制

  %o  输出8进制

  %x  输出16进制

浮点类型  

  float  7个有效位  1.23f表示float  scanf %f    printf %f /%e  

  double  15个有效位   1.23表示double  scanf %lf  printf %f/%e

  printf("%.3f",f)  //保留小数点后三位,自动四舍五入,注意如果1.2345一般输出1.234,因为1.2345实际表示为1.23449999..

浮点数比较大小

  浮点数一般不能直接比较大小,因为精度的问题一般都不相等

  若想比较大小使用

    fabs(f1-f2)<1e-12  //比较float  <1e-18比较double

浮点数表示inf和nan

  printf("%f",12.0/0.0)  //inf

  printf("%f",-12.0/0.0)  //-inf

  printf("%f",0.0/0.0)  //nan

  printf("%d",12/0)  //编译错误

 

字符类型

   单引号表示字符

  %c输入输出

  scanf("%d %c")  //不加空格的话后面%c读入的就是空格

           // 输入 1  (注意这里有两个空格)a  读入的字符仍然是a,因为后面的空格(和换行、制表符)都被读了

 

逃逸字符

  \"  //表示双引号

  \b  //回退一格

  \'  //单引号

  \t  //下一个表格位,相当于用了一个tab

  \n  //换行

  \r  //回车,回到行首

类型转换

  自动转换为宽类型

  对于printf ,任何小于int的类型都会被转换成int,float会转换成double

  但是scanf不会,要输入short,需要%hd

  强制类型转换

  (类型)值

  强制类型转换优先级高于四则运算

  int i=(int)a/b    //错

  int i=(int)(a/b)    //对

 

#include<stdio.h>
int main()
{
int a = 2147483647;  //int的最大正整数,0后面31个1
int b = -1;//32个1
unsigned int c = 4294967295;//4294967295为32个1
long long int d = 4294967296;//4294967296为1个1后面32个0

printf("sizeof(int) = %d\n", sizeof(int));
printf("sizeof(long long) = %d\n", sizeof(long long));
printf("用int表示一个1后面31个0: \t%d\n", a+1); //a+1就是一个1后面31个0,b+1是一个1后面32个0
printf("用int表示32个1: \t%d\n", b);
printf("用int表示32个0: \t%d\n", b+1);
printf("用long long表示一个1后面31个0: \t%lld\n", a+1);
printf("用long long表示32个1: \t%lld\n", b);
printf("用long long表示1后面32个0: \t%lld\n", b+1);
printf("用long long表示4294967295+1: \t%lld\n", c+1);
printf("用long long表示4294967296: \t%lld\n", d);

return 0;
}

 

 

结论:int强制转换为long long,会添加32位,第一位加的是0表示正数,printf输出的时候发生int转向long long时,先计算后面表达式的值再转long long,并且后面的表达式先计算的时候仍然会导致越界时候进位丢失,参考以lld格式输出b+1,b表示32个1,b+1之后变成了32个0,进位丢失,然后再lld输出的时候前面补上32个0,结果为0。

 

bool 类型

  c语言没有实际的bool类型,给一个bool类型的数字赋1、2、3等等都是可以的。输出的时候也是使用%d来输出,0表示false,1表示true.

 

运算符的优先级

 

逻辑运算符&&和||会短路,对于&&,如果左边是false,就不会执行右边,对于||,如果左边是true,也不会执行右边。

 

条件运算符  a?b:c  优先级只比赋值高  

逗号运算符  ,  主要用在for循环里面  for(i=0,j=10;i<j;i++,j--)...  优先级比赋值还低

    逗号运算符会把逗号右边的表达式作为结果返回,例如:

        a=3+4,5+6      //warning:5+6 not used    a的结果是7

        a=(3+4,5+6)    //warning:3+4not used    a的结果是11


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM