C语言笔记

浮点数存储格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string.h>
#include <iomanip> // 包含对输出格式化的操纵符

int main()
{
char doubledata[8] = { 0 };
double * data_doule = (double * )doubledata;
float * data_float = (float * )doubledata;
*data_doule = 1000.23578;
//std::cout << std::hex << doubledata[0] << " " << doubledata[1] << " " << doubledata[2] << " " << doubledata[3] << " " << doubledata[4] << " " << doubledata[5] << " " << doubledata[6] << " " << doubledata[7] << std::endl;
std::printf("%x %x %x %x %x %x %x %x\n", doubledata[0]&0xFF, doubledata[1] & 0xFF, doubledata[2] & 0xFF, doubledata[3] & 0xFF, doubledata[4] & 0xFF, doubledata[5] & 0xFF, doubledata[6] & 0xFF, doubledata[7] & 0xFF);
*data_doule = 1001.23578;
std::printf("%x %x %x %x %x %x %x %x\n", doubledata[0] & 0xFF, doubledata[1] & 0xFF, doubledata[2] & 0xFF, doubledata[3] & 0xFF, doubledata[4] & 0xFF, doubledata[5] & 0xFF, doubledata[6] & 0xFF, doubledata[7] & 0xFF);

*data_float = 100.23578;
//std::cout << std::hex << doubledata[0] << " " << doubledata[1] << " " << doubledata[2] << " " << doubledata[3] << " " << doubledata[4] << " " << doubledata[5] << " " << doubledata[6] << " " << doubledata[7] << std::endl;
std::printf("%x %x %x %x %x %x %x %x\n", doubledata[0] & 0xFF, doubledata[1] & 0xFF, doubledata[2] & 0xFF, doubledata[3] & 0xFF, doubledata[4] & 0xFF, doubledata[5] & 0xFF, doubledata[6] & 0xFF, doubledata[7] & 0xFF);
*data_float = 101.23578;
std::printf("%x %x %x %x %x %x %x %x\n", doubledata[0] & 0xFF, doubledata[1] & 0xFF, doubledata[2] & 0xFF, doubledata[3] & 0xFF, doubledata[4] & 0xFF, doubledata[5] & 0xFF, doubledata[6] & 0xFF, doubledata[7] & 0xFF);
}
结果:
68 e8 9f e0 e2 41 8f 40
68 e8 9f e0 e2 49 8f 40
b8 78 c8 42 e2 49 8f 40
b8 78 ca 42 e2 49 8f 40

按照结果查看,浮点数的存储是大端模式

C语言控制硬件读写操作

控制底层读写数据或操作

总结:当写内部NOR FALSH,例如NOR FALSH,每次写入数据是4字节,创建存储数组时候,最好是按照4字节创建,如果按照字符创建,可能数据不是对齐状态,创建在一个奇数地址,导致数据存储的时候,报异常,导致程序异常,这时候,要么选择按照4字节格式创建数组,按字节创建时候,需要设置4字节对齐操作 __attribute__((aligned(4)))

混合定义C语言

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
// Extended Memory Management
struct EMM {
uint32_t *mem; // Pointer to Memory Image
uint32_t *atr; // Pointer to Memory Attributes
};


struct EMM (*slots1[256])[256] = {
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
/* 00 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 10 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 20 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 30 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 40 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 50 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 60 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 70 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 80 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* 90 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* A0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* B0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* C0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* D0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* E0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
/* F0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
};

struct EMM (*slots1[256])[256] 表示:

  • slots1 是长度为 256 的指针数组;
  • 每个指针指向 EMM 类型的 256 元素数组