规则 6.1(必须):纯char
类型仅应用于存储和使用字符值
规则 6.2(必须):signed char
和 unsigned char
类型仅应用于存储和使用数值
存在三种不同的 char
类型:char
(纯)、signed char
和 unsigned char
。signed char
和 unsigned char
应用于数值数据,而 char
(纯)类型应用于字符数据。
规则 6.3(建议):应使用指示大小和符号性的 typedef
替换基本数值类型
基本数值类型,包括 char
、int
、short
、long
的带符号和无符号变体以及 float
和 double
,不应当被直接使用,而应当使用特定长度的 typedef
。
对于 32 位整数机器,定义如下:
typedef char char_t;
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef signed short int16_t;
typedef unsigned short uint16_t;
typedef signed int int32_t;
typedef unsigned int uint32_t;
typedef signed long int64_t;
typedef unsigned long uint64_t;
typedef float float32_t;
typedef double float64_t;
typedef long double float128_t;
规则 6.4(必须):位字段应当仅被定义为 unsigned int
或 signed int
类型
虽然位字段本身使用unsigned int
和signed int
可以避免由此导致的未定义行为。
/* 以下没有遵循MISRA-C标准 */
struct CharBitFields {
unsigned char flag1 : 1; // 1 bit
unsigned char flag2 : 2; // 2 bits
unsigned char value : 5; // 5 bits
};
/* 正确定义,注意该结构体占用32Bytes */
struct IntBitFields {
unsigned int flag1 : 1; // 1 bit
unsigned int flag2 : 2; // 2 bits
unsigned int value : 5; // 5 bits
};
规则 6.5(必须):带符号类型的位字段长度至少应当为2位
长度为1位的带符号位字段没有实际用途。