【编程语言】C
一、数据类型的基本归类
- 整型
char // C语言没有明确规定char默认有无符号,故取决于编译器(通常是signed char)
signed char
unsigned char
short // ==signed short
signed short
unsigned short
int // ==signed int
signed int
unsigned int
long // ==signed long
signed long
unsigned long
long long // ==signed long long
signed long long
unsigned long long
整型的表示范围在头文件limits.h中定义。
- 浮点型
float
double
- 构造类型
// 数组类型
struct // 结构体类型
enum // 枚举类型
union // 联合类型
-
指针类型
-
空类型
二、整型存储规则
2.1 原码、反码、补码
整型数据的二进制表现形式有三种:原码、反码、补码。存在计算机中的整数数据都是补码。
三种表示形式都由符号位和数值位两部分构成。符号位是二进制的最高位,为0表示“正数”,为1表示“负数”。
原码就是直接将非负整数部分转换成二进制形式,再根据正负在符号位写0/1。
对于正整数,原反补相同。
如:int类型的10的原反补码都是00000000 00000000 00000000 00001010。
对于负整数,原反补需要进行转换。
2.1.1 转换规则
原码->反码->补码:
按位取反(符号位不变,其他位取反),+1。
补码->原码:
方法1:-1,按位取反;
方法2:按位取反,+1。
如:int类型的-10的原码是10000000 00000000 00000000 00001010(0x 80 00 00 0a),反码是11111111 11111111 11111111 11110101(0x ff ff ff f5),补码是11111111 11111111 11111111 11110110(0x ff ff ff f6)。
-1的补码是全1。
2.2 大小端字节序存储
字节序存储:以字节为单位,讨论存储顺序。(所以char类型不需要讨论存储顺序)
大端字节序存储:数据高位字节的内容存储在低地址处,低位存储在高地址处;
小端字节序存储:数据低位字节的内容存储在低地址处,高位存储在高地址处。
比如int类型的0x12345678,从低地址到高地址,大端是12 34 56 78,小端是78 56 34 12。

// 验证大小端
#include <stdio.h>
int check_sys()
{
int a = 1;
return *(char*)&a; // 小端返回1,大端返回0
}
int main()
{
int ret = check_sys();
if (ret)
printf("小端\n");
else
printf("大端\n");
return 0;
}

2.3 signed、unsigned
对于signed类型,第一位是符号位,其他位是数值位,0正1负;对于unsigned类型,没有符号位,都是数值位,所以表示范围比较大。
对于signed char:
00000000=0
00000001=1
......
01111111=127
10000000=-128 # 因为无法从补码还原回原码(会影响符号位),所以直接被解析成取值范围中的最小负数
10000001=-127
......
11111110=-2
11111111=-1

所以signed char范围是[-128, 127],即[−27-2^7−27, 272^727-1]
对于unsigned char:
00000000=0
00000001=1
......
01111111=127
10000000=128
10000001=129
......
11111110=254
11111111=255
所以unsigned char范围是[0, 255],即[0, 282^828-1]

short、int…同理。
本文详细介绍了C语言中的数据类型分类,包括整型(如signedchar、unsignedchar等)、浮点型、构造类型(如数组、结构体、枚举和联合),以及整型的原码、反码和补码表示、大小端字节序存储的概念和示例。还探讨了signed和unsigned类型的取值范围差异。

被折叠的 条评论
为什么被折叠?



