数据和C
且任容枯 Lv4

数据和C

数据类型关键字

最初的关键字 C90添加 C99添加
int singed _Bool
long void _Complex
short _Imaginary
unsinged
char
float
double
  • 位:最小的存储单元是位,可以存储0或1

  • 字节是常用的计算机存储单位,一字节为8位

  • 字是设计计算机时给定的自然存储单元,计算机的字长越大,其数据转移越快,允许的内存访问也更多

  • 整数没有小数部分,浮点数有小数部分

  • 浮点数可以表示的范围比整数大

  • 对于一些算术运算(很大的数想减),浮点数损失的精度很多

  • 虽然在任何区间都存在无数个实数,但是计算机的浮点数无法表示区间内的所有值7.0会存储位6.99999

基本数据类型

int
1
2
3
int a, b = 1   /*不推荐 不要把初始化和未初始化的变量放在同一条声明中*/ 

print("%d",b)

0x或0X表示十六进制值

0前缀表示八进制

使用不同的进制是为了方便,并不会改变数被存储的方式

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main(void){
int num = 100;
printf("dec = %d; octal = %o; hex = %x\n",num,num,num);
printf("dec = %d; octal = %#o; hex = %#x\n",num,num,num);
return 0;
}
dec = 100; octal = 144; hex = 64
dec = 100; octal = 0144; hex = 0x64
整数溢出
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main(void){
int num = 2147483647;
unsigned int num2 = 4294967295;

printf("%d %d %d\n", num, num+1, num+2);
printf("%u %u %u\n", num2, num2+1, num2+2);
return 0;
}
2147483647 -2147483648 -2147483647
4294967295 0 1
存的是补码

打印unsinged int 使用%u

打印long使用%ld %lx %lo

打印short 使用%hd %hx %ho

打印long long 使用%lld %llu

char

转义序列

转义序列 含义
\a 警报
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\\ 反斜杠
\‘ 单引号
\\“ 双引号
? 问号
\0oo 八进制(o 0-7)
\xhh 十六进制(h 0-f)

int类型的常量写法

类型 十六进制 八进制 十进制
char \x41 \101 N.A.
int 0x41 0101 65
unsigned int 0x41u 0101u 65u
long 0x41L 0101L 65L
unsigned long 0x41UL 0101UL 65UL
long long 0x41LL 0101LL 65LL
unsigned long long 0x41ULL 0101ULL 65ULL
可移植类型

stdint.h inttypes.h

1
2
3
4
5
6
7
8
#include <stdio.h>
#include <inttypes.h>
int main(void){
int32_t me32;
me32 = 45933945;
printf("me32 = %d\n", me32);
printf("me32 = %"PRId32"\n",me32);
}
float 、double 、long double

float类型必须至少能表示6位有效数字,且取值范围至少是10^-37^~10^37^

1
0xa.1fp10

十六进制a.1f p10 指的是2^10^ C99

类型大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main(void){
printf("int is %zd bytes.\n", sizeof(int));
printf("char is %zd bytes.\n", sizeof(char));
printf("long is %zd bytes.\n", sizeof(long));
printf("long long is %zd bytes.\n", sizeof(long long));
printf("double is %zd bytes.\n", sizeof(double));
printf("long double is %zd bytes.\n", sizeof(long double));
return 0;
}

int is 4 bytes.
char is 1 bytes.
long is 4 bytes.
long long is 8 bytes.
double is 8 bytes.
long double is 16 bytes.