首页 > 技术文章 > C 数据类型

jhxxb 2020-08-17 15:33 原文

一、标识符

1.1、常量

程序运行时其值不能改变,必须先定义后使用。

  • 直接常量
  • 符号常量
定义符号常量格式:#define  符号常量  常量

#define 是一条预处理命令(预处理命令都以 # 开头),也称为宏定义命令。它的功能就是把程序中所有出现的标识符都替换为随后的常量

#include <stdio.h>
#define NAME "JHXXB"
#define PI 3.1415926

int main()
{
    printf("my name is %s\n", NAME);
    return 0;
}

 

1.2、变量

程序运行过程中,其值可以被改变,必须先定义后使用。

格式:存储类型    数据类型    变量名 = 初值;

对变量的赋值实际上就是将数据写到变量所对应的内存单元中。

 

1.3、标识符

用来标识变量、常量、函数等的字符序列

  • 区分大小写
  • 英文(A-Z,a-z)、数字(0-9),下划线(_)组成
  • 字母或下划线开头
  • 不能使用关键字命名

关键字如下:

auto
break case char const continue
default
do
double else enum extern
float
for goto if
int long register return short signed sizeof static
struct switch typedef union unsigned
void
volatile
while

1999 年 12 月 16 日,ISO 推出了 C99 标准,该标准新增了 5 个 C 语言关键字:

inline restrict _Bool _Complex _Imaginary

2011 年 12 月 8 日,ISO 发布 C 语言的新标准 C11,该标准新增了 7 个 C 语言关键字:

_Alignas _Alignof _Atomic _Static_assert _Noreturn _Thread_local _Generic

 

二、数据类型

sizeof() 函数可以检测类型大小

https://www.cnblogs.com/jhxxb/p/11154925.html

2.1、基本数据类型(不可以再分解为其他类型)

整型

  • 整型(int,32 位上占 4 字节(-2147483648~2147483647),16 位上占 2 字节(-32768~32767))
  • 短整型(short,2 byte,-32768~32767)
  • 长整型(long,4 byte,-2147483648~2147483647)

实型(浮点型)

  • 单精度型(float, 4 byte,10^(-37)~10^38)
  • 双精度型(double, 8 byte,10^(-307)~10^308)

字符型(char,占 1 字节,-128~127,a = 'C')

2.2、构造数据类型(复杂数据类型,可以分解为若干个基本数据类型或构造数据类型)

  • 数组
  • 结构体(struct)
  • 联合体(union)
  • 位域
  • 枚举(enum)

2.3、指针类型(其取值类似于整型,但这是两个完全不同的量,指针的取值代表地址)

2.4、空类型(void,语法完整性,表示不需要具体的数据值)

2.5、定义类型(typedef)

 

三、简单数据类型(整型、实型(浮点型)、字符型(字符串))与范围表示

3.1、整型常量

表示形式

  • 十进制整数(0-9 和正负号):123
  • 八进制整数(数字 0 开头,后面 0-7):015(13),-012(-10)
  • 十六进制整数:(0x 或 0X 开头,后面 0-9,A-F(a-f)):0X2A(42),-0xA0(-160)

分类

  • 整型常量后加字母 l 或 L,就认为是 long int 型常量。例:123L 41l
  • 整型常量后加后缀 u 或 U,就认为是无符号常量。例:38U 41u
  • 根据范围确定类型(int 或 long),前缀后缀可一起使用,例:0XA5Lu(十六进制无符号长整数 A5,十进制为165)

 

3.2、整数在内存中的表示(计算机系统规定:整数的数值在内存中以补码的形式存放)

1 字节 = 8 位

  • 十进制数(真值):+14
  • 机器数表示形式(补码,16 位内存单元):0000000000001110
  • 内存实际存放形式(16 位内存单元):
低字节    00001110    低地址 ↓
高字节    00000000    高地址 ↓
  • 机器数表示形式(补码,32 位内存单元):00000000000000000000000000001110
  • 内存实际存放形式(32 位内存单元):
低字节    00001110    低地址 ↓
         00000000          ↓
         00000000          ↓
高字节    00000000    高地址 ↓

 

  • 十进制数(真值):-14
  • 机器数表示形式(补码,16 位内存单元):1111111111110010(负数补码:符号位不变,其它位取反,最后加一)
  • 内存实际存放形式(16 位内存单元):
低字节    11110010    低地址 ↓
高字节    11111111    高地址 ↓
  • 机器数表示形式(补码,32 位内存单元):11111111111111111111111111110010
  • 内存实际存放形式(32 位内存单元):
低字节    11110010    低地址 ↓
         11111111          ↓
         11111111          ↓
高字节    11111111    高地址 ↓

 

  • 十进制数(真值):-65537 = 2^16 + 1
  • 机器数表示形式(补码,32 位内存单元):11111111111111101111111111111111(负数补码:符号位不变,其它位取反,最后加一)
  • 内存实际存放形式(16 位内存单元):
低字节    11111111    低地址 ↓
高字节    11111111    高地址 ↓
  • 内存实际存放形式(32 位内存单元):
低字节    11111111    低地址 ↓
         11111111          ↓
         11111110          ↓
高字节    11111111    高地址 ↓

在 16 位内存单元上, -65537 在内存中的值与 -1 在内存中的值是一样的,因为 -65537 超出了 16 位内存单元表示数的范围,也就是发生了数据溢出。

 

3.3、整型变量

整型变量的基本类型符是 int,计算机会为这个变量分配相应大小的内存单元。

整型变量的分类(是否有符号:signed(默认)、unsigned;整型变量值域范围:short、long)

  • 有符号基本型:int
  • 无符号基本型(非负数):unsigned int
  • 有符号短整型:short int 或 short
  • 无符号短整型(非负数):unsigned short int 或 unsigned short
  • 有符号长整型:long int 或 long
  • 无符号长整型(非负数):unsigned long int 或 unsigned long

有符号与无符号在计算机内存中表示是不区分的,都是以其补码形式表示,只是运算时有区别(怎样看待最高二进制位)

unsigned int a = -2;

printf("%d", a); // -2
printf("%u", a); // 4294967294

 

3.4、实型常量

两种表现形式

  • 十进制小数:0.0、0.25、.13、-.03、5.789
  • 十进制指数:2.1E5 表示 2.1*10^5、3.7E-2 表示 3.7*10^(-2)

 

3.5、实数在内存中的存放形式(按指数形式存放)

通常一个实数需要 4 字节(32位)

分成三部分((+/-) a E n):最高位是符号位,剩下(a E n)的 31 位存实数和尾数(按照 IEEE 标准)

常用浮点数格式:

  符号位 尾数 阶码 总位数
短浮点数 1 23 8 32
长浮点数 1 52 11 64
临时浮点数 1 64 5 80

以 68.78 = 0.6875 * 10^2 为例

位数(十进制) a:0.6875
阶码(十进制) n:2
阶码(二进制) n:000000010 存放形式: 符号位(1位) 位数部分(23位) 阶码部分(8位) 0 1011 0000 0000 0000 0000 0000 0000 0010

 

3.6、实型变量分类、定义和精度

  • 单精度实型(float,4 byte,精确表示 7~8 个数字)
  • 双精度实型(double(long float),8 byte,精确表示 16~17 个数字)
  • 长双精度实型(long double,10 byte(VC 下占用 8 byte),精确表示 17~18 个数字)

实型默认按 double 类型处理

对于一个十进制实数,不一定能用二进制数精确表示

float a;
double b, c;
a = 123.456789;
b = a; // 这时的 a 已经丢失了 123.456789 的精度,再赋值给 b 也不会还原,只有像下一行重新复制才行
c = 123.456789;
printf("a=%f, b=%lf, c=%lf", a, b, c); // a=123.456787, b=123.456787, c=123.456789 结果中 a,b 最后一位是随机输出的

 

3.7、字符型数据和字符串常量

字符型(1 字节,8 位)数据就是整型数据,存放字符对应的 ASCII 码的值。

字符常量有两种表示形式:单引号括起来,使用转义字符(特殊的字符常量,以 \ 开头)。

C 语言字符集中任何一个字符均可用转义字符(\ddd,\xhh)表示。

转义字符意义ASCII码值(十进制)
\a 响铃(BEL) 007
\b 退格(BS) ,将当前位置移到前一列 008
\f 换页(FF),将当前位置移到下页开头 012
\n 换行(LF) ,将当前位置移到下一行开头 010
\r 回车(CR) ,将当前位置移到本行开头 013
\t 水平制表(HT) (跳到下一个TAB位置) 009
\v 垂直制表(VT) 011
\\ 代表一个反斜线字符''\' 092
\' 代表一个单引号(撇号)字符 039
\" 代表一个双引号字符 034
\0 空字符(NULL) 000
\ddd 1~3 位八进制数所代表的任意字符,d(0~7) 三位八进制
\xhh 1~2 位十六进制所代表的任意字符,h(0~f) 二位十六进制

使用转义字符时需要注意以下问题:

  • 转义字符中只能使用小写字母,每个转义字符只能看作一个字符。
  • \v 垂直制表和 \f 换页符对屏幕没有任何影响,但会影响打印机执行响应操作。
  • 在 C 程序中,使用不可打印字符时,通常用转义字符表示。
  • 转义字符 ’\0’ 表示空字符 NULL,它的值是 0。而字符 '0' 的 ASCII 码值是 48。因此,空字符 ’\0’ 不是字符 0。另外,空字符不等于空格字符,空格字符的 ASCII 码值为 32 而不是0。编程序时,读者应当区别清楚。
  • 如果反斜线之后的字符和它不构成转义字符,则 ’\’ 不起转义作用将被忽略。

字符型变量可以参与运算,C 语言将字符型数据分为有符号字符和无符号字符。

字符串常量由一对双引号括起来,C 语言中没有字符串变量,用字符数组(char[])存的字符串。

字符串常量占的内存字节数等于字符串中字符个数加一,增加的一个字节存放 \0(ASCII 码为 0),这是字符串结束标志。

3.8、位运算

8:十进制
00000000000000000000000000001000:二进制

00000000000000000000000000001000:补码

00000000000000000000000000010000 << 1:左移
00000000000000000000000000000100 >> 1:右移
00000000000000000000000000000100 >>> 1:无符号右移

------------------------------------------------------------------------

-8:十进制
10000000000000000000000000001000:二进制

11111111111111111111111111110111:符号位不变,其它位取反
11111111111111111111111111111000:最后加一即为负数的补码

11111111111111111111111111110000 << 1:左移
11111111111111111111111111111100 >> 1:右移
01111111111111111111111111111100 >>> 1:无符号右移

------------------------------------------------------------------------

-2 补码:0xFFFE。会位移 0xFFFE(0xFFFFFFFE) mod 32 = 30位
-1 >>> -2 等价于 -1 >>> (32+(-2))=30
-1L >>> -2 等价于 -1L >>> (64+(-2))=62

 


(取值范围) https://blog.csdn.net/weixin_42856843/article/details/81989737

(数据类型) https://www.cnblogs.com/ricksteves/p/9899893.html

(数据类型) https://fishc.com.cn/thread-67055-1-1.html

(取值范围) https://fishc.com.cn/thread-67265-1-1.html

(转义字符) https://blog.csdn.net/ce123_zhouwei/article/details/9074121

(ASCII码表) https://fishc.com.cn/thread-67427-1-2.html

(GDB) https://zhuanlan.zhihu.com/p/483372519

推荐阅读