C语言基本数据类型笔记
摘自C primer plus
- 位、字节和字
- 整数类型和浮点数类型
位 (bit):最小存储单元,可以存储0或1
字节(byte):常用计算机存储单元,几乎对所有机器,1字节均为8位
字(word):设计计算机时给定的自然存储单位。对于8位微型计算机1个字长只有8位。个人计算机字长增至16位、32位,直至目前64位。
-
int类型
其范围依计算机而异 ,早期16位 ,目前32位 、64位,一般存储一个int 要占用一个机器字长。
ISO C规定int类型范围最小为-32768 ~ 32767(,除去符号位)。
int main(void)//以十进制 十六进制 八进制打印100
{
int x = 100;
printf("dec = %d; octal = %o; hex = %x\n", x, x, x );
//显示进制前缀
printf("dec = %d; octal = %#o; hex = %#x\n", x, x, x );
return 0;
}
其他整型:short 类型占用存储空间不能多于int类型; long类型占用存储空间不能少于int 类型。
目前个人计算机上常见的设置是,long long占64位,long占32位,short占16位,int占16位或32位(依计算机字长而定,32位64位机都占32位/4Byte)。
- char类型
char类型用于存储字符(字母或标点符号),实际存储的是整数而不是字符,计算机用编码处理字符。C 将1字节定义为char类型占用的位数。
// 显示字符代码编号
int main(void)
{
char ch;
char cb;
cb = 'T'; //字符常量
cb = "T" ;//字符串
printf("Please enter a character.\n");
scanf("%c", &ch);
printf("The code for %c is %d\n",ch, ch );
return 0;
}
- float、double类型
C规定 :float类型必须能表示6位有效数字(至少精确表示小数点后6位有效数字),且取值范围至少是~。
通常系统存储一个浮点数要占用32位,8位用于表示指数的值和符号,剩下24位用于表示非指数部分。
double(双精度)类型与float类型最小取值范围相同但必须至少能表示10位有效数字。一般情况下double类型占用64位而不是32位。
int main(int argc, char const *argv[])
{
float aboat = 32000.0;
//以两种方式显示float类型的值
printf("%f can be written %e\n",aboat, aboat );
return 0;
}
- 数据类型大小
提供可移植类型 stdint.h 和 inttypes.h,确保C语言类型在各系统功能相同
在int为32位的系统中会把int32_t作为int的别名
在int为16位、long为32位的系统会把int32_t作为long的别名
#include<stdio.h>
#include <inttypes.h> //使用配套宏"PRId64"进行打印 unsigned long long int
// 打印当前系统指定类型大小
// C99 C11提供%zd转换说明匹配sizeof的返回类型(size_t)
int main(int argc, char const *argv[])
{
int apples = 3;//正确
int oranges = 3.0;//不提倡
//精度丢失
int cost = 12.99; //丢弃小数部分
float pi = 3.1415926536;//float只保证前6位精度
printf("Type int has a size of %"PRId64"bytes.\n", sizeof(int));
printf("Type char has a size of %"PRId64" bytes.\n", sizeof(char));
printf("Type long has a size of %"PRId64" bytes.\n", sizeof(long));
printf("Type long long has a size of %"PRId64" bytes.\n", sizeof(long long));
printf("Type double has a size of %"PRId64" bytes.\n", sizeof(double));
printf("Type long double has a size of %"PRId64" bytes.\n", sizeof(long double));
return 0;
}