C语言基础

Posted by Mr.Zhang on 2023-06-13
Estimated Reading Time 2 Minutes
Words 491 In Total

此篇博文用于记录c语言的一些基础特性。

测试环境

gcc version 8.1.0 (x86_64-win32-sjlj-rev0, Built by MinGW-W64 project)

枚举类型测试

MISRA Rule 10.1 Operands shall not be of an inappropriate essential type

其中关于枚举类型操作数有以下说明:
枚举型的操作数不应在算术运算中使用,因为枚举对象使用实现定义的整数类型,枚举型是否有符号依赖于编译环境。因此,涉及枚举对象的操作可能会产生意外类型的结果。
请注意,来自匿名枚举的枚举常量的基本类型为有符号型。

测试过程及结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <stdint.h>

typedef enum _TEST_ENUM_T
{
TEST_VALUE_DEFAULT = 0,
TEST_VALUE_0,
TEST_VALUE_1,
TEST_VALUE_2,
}
TEST_ENUM_T;

int main(void)
{
TEST_ENUM_T testEnumValue = TEST_VALUE_DEFAULT;
uint8_t U8 = 0u;
uint16_t U16 = 300u;
uint32_t U32 = 0xFFFFFFFEu;

int32_t I32 = -2;
int64_t I64 = INT64_MIN; //-9223372036854775808

testEnumValue++; //testEnumValue is TEST_VALUE_0
testEnumValue -= 2; //testEnumValue is 4294967295

I32 = testEnumValue; // I32 is -1
I32 = -10;
testEnumValue = I32; //testEnumValue is 4294967286

testEnumValue = I64; //testEnumValue is TEST_VALUE_DEFAULT


return 0;
}

ENUM_T01

另关于"匿名枚举的枚举常量的基本类型为有符号型",暂未想到怎么来测试验证,留后补充.

Note:

嵌入式交叉编译器通常可以配置enum的基本类型,故为了提升代码的可移植性,应遵循MISRA的相关建议,不应依赖于编译器实现.
ENUM_T02

float类型

浮点类型的实现可能对程序行为产生重大影响,例如:
◆ 值的范围及其存储的精度;
◆ 浮点运算后的取整方向;
◆ 转换为较窄的浮点类型或整数类型时的取整方向;
◆ 下溢,下溢和非数值存在的行为;(NaNs <-> Not-a-Numbers)
◆ 库函数的定义域和值域错误的事件的行为

float中的特殊值及其16进制值

+0 : 0x00000000
-0 : 0x80000000
Infinity : 0x7F800000
-Infinity : 0xFF800000
NaN : 0x7F800001~0x7FFFFFFF,0xFF800001~0xFFFFFFFF

发现一个关于float类型测试的网站: https://www.h-schmidt.net/FloatConverter/IEEE754.html

FLOAT_T01


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !