【C语言】基本数据类型

  C语言作为一种计算机高级语言,其主要特点之一就是:数据类型丰富。首先,所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度,即占多少字节,还有数据的存储形式。其次,不同的类型分配不同的长度和存储形式。
     这里写图片描述
 上面列举出的都是基本类型,其实还有枚举类型、空类型等,此处先不作讲解。
 基本类型有这么多,那在内存中计算机分别为它们分配多少字节呢?

#include <stdio.h>  
#include <stdlib.h>  
int main()
{
    printf("%d\n", sizeof(int));//4
    printf("%d\n", sizeof(short));//2
    printf("%d\n", sizeof(long));//4    
    printf("%d\n", sizeof(long long));//8
    printf("%d\n", sizeof(char));//1
    printf("%d\n", sizeof(float));//4
    printf("%d\n", sizeof(double));//8
    system("pause");
    return 0;
}

这里写图片描述 
  注:sizeof是C/C++中的一个操作符(并不是函数),其作用就是返回一个对象或者类型所占的内存字节数。返回值类型为size_t。
基本整型(int)
  编译器(Visual C++)为int型数据分配4个字节(32个bit位)。
  存储方式:以整数的补码形式存放。若为正数,它的原码、反码和补码相同;若为负数,其补码的求法为:先将此数的绝对值写成二进制形式,然后所有bit位按位取反得到反码,反码加1便得到补码。如下图:
  这里写图片描述
  下图为求-10的补码:
  这里写图片描述
  表示范围(4个字节):-2³¹~(2³¹-1)。
  短整型(short int)
  编译器为short型数据分配2个字节。存储方式与int型相同,此处不再说明。
  表示范围(2个字节):-32768~32767。
  注意:
  ⑴ 只有整型(包括)字符型数据可以加signed(有符号的)和unsigned(无符号的)修饰符,实型数据不能加。
  ⑵ 对无符号整型数据用“%u”格式输出。%u表示用无符号十进制数的格式输出。
  ⑶ 若未指定是signed还是unsigned,则默认为signed。如signed int a和int a等价。
  ⑷ 无符号型变量只能存放unsigned型整数,且其存储单元中最左边一位不再表示符号,而表示数值。
  字符型(char)
  编译器为一个char型数据分配1个字节的存储空间。
  存储方式:字符是以整数形式(字符的ASCII代码)存放在内存单元中的。如字符‘a’在内存中按下图形式存放
  这里写图片描述
  字符变量:用char定义一个字符变量。如:

char c = 'b';//定义一个字符变量c,并初始化为字符'b'

‘b’的ASCII代码是98,则系统把整数98赋给变量c。在输出字符变量的值时,可以选择以十进制整数形式或字符形式输出。如:

char c = 'b';
printf("%d   %c\n", c, c);

这里写图片描述
  字符型又可以像int型数据分为有符号和无符号:signed char和unsigned char,这两种都占1个字节,但是它们的取值范围有所不同。
  signed char:有符号字符型,取值范围为-128~127;
  unsigned char:无符号字符型,取值范围为0~255。
  注意:
  ⑴ 虽然有符号字符型允许存储的值为-128~127,但字符的代码不可能为负值,所以在存储字符时实际上只用到0~127,其代码二进制形式最左边一位(符号位)均为0。
  ⑵ 字符型不同于整型,当字符型未指定为signed还是unsigned时,由各编译器自行决定,而整型会默认为signed。
  浮点型(float和double)
  规范化的指数形式:如3.14159的规范化的指数形式为0.314159×10¹。
  浮点型数据是用来表示具有小数点的实数的,而且实数是以指数形式存放在存储单元中的。任意一个二进制浮点数V可表示成下面的形式:
  (-1)^S*M*2^E,
  其中:(-1)^S表示符号位,S为0,V为正数,S为1,V为负数;M表示有效数字,1≤M<2;2^E表示指数位。如:十进制数5.5转化成二进制位101.1=1.011×2²,即S=0,M=1.011,E=2。
  float:单精度浮点型,在内存中占4个字节。在存储单元中,最高位是符号位,接着的8位为指数E,剩余的23位为有效数字M,如下图:
  这里写图片描述
  小数部分占的位数越多,数的有效数字越多,精度也就越高。指数部分占的位数越高,则能表示的数值范围越大。
  double:双精度浮点型,在内存中占8个字节(64bits)。在存储单元中,最高位是符号位S,接着11位为指数E,剩下的52位为有效数字M,如下图:
  这里写图片描述
  下面对有效数字M和指数E作详细讲解:
  M:1≤M<2,在保存M时,默认M的第一位总是1,故可舍去,只保存后面部分,如保存1.01,只保存01,待读取时再加上1。这样做的目的是:节省一位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。
  E:当E为8bits,取值范围为0~255;当E为11bits,取值范围为0~2047。
  由于指数E有可能出现负数,故规定:8bits的E,其真实值必须再加一个中间数127;11bits的E,其真实值必须再加一个中间数1023。(这两个规定并非只针对E为负数的情况)
  ⑴当E为全0:即真实值+127(或1023)=0,则真实值=-127(或-1023)。此时,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数以表示±0和接近于0的很小的数字。
  ⑵当E为全1:即E的真实值为128(或1024),此时,M若全为0,则表示±∞。
  ⑶当E不为全1或不为全0:(计算值)E-127(或1023)=E(真实值),再将有效数字M前加上第一位的1,如0.5转化为二进制是0.1,由于规定整数部分必须为1,即将小数点右移1位则为1.0*2^(-1),E为-1,-1+127=126即:01111110,而尾数1.0去掉整数部分为0,补齐23位0则可得:0 01111110 00000000000000000000000
  以上就是这次我分享的所有内容。由于博主水平有限,其中定不乏缺点和不足,热切期望得到读者的批评和指正,谢谢! 
   
  

猜你喜欢

转载自blog.csdn.net/Sunshine_R9H15Chen/article/details/78324501