首页 > 编程语言 > 详细

C语言数据类型

时间:2020-06-15 19:26:01      阅读:36      评论:0      收藏:0      [点我收藏+]

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;https://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表示一个1后面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。

 

C语言数据类型

原文:https://www.cnblogs.com/foodie-nils/p/13110299.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!