回复【2楼】 zenghi :
---------------------------------
嗯,你对联合体的理解没错,
而 uint32_t 是标准库里的定义,32位无符号整数,32位也就是4个字节,
因为STM32是小端字节序的,如果假定假定一个32位变量的首地址是 0x20000000,这个变量的值是(0x01020304),那个这个变量的各个字节在内存中的分布这样的,
(地址:0x20000000)低16位的低8位, 值为 0x04
(地址:0x20000001)低16位的高8位, 值为 0x03
(地址:0x20000002)高16位的低8位, 值为 0x02
(地址:0x20000003)高16位的高8位, 值为 0x01
大端的变量的内部的字节顺序的分布正好相反。
所谓大小端,只不过是CPU对内存中的变量的解释罢了。CPU存取变量,都按照它自己对变量的解释来进行存取。
另外,C++的标准是这样说的:(参考http://en.cppreference.com/w/cpp/language/types) (不知上哪找C的标准 )
ejaVuSerif, 'DejaVu Serif', verdana, sans-serif;font-size:13px;line-height:19px;">1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long).
char 是只占一个字节的
因为C语言的基本数据类型(short, int, long int 等...)的大小是和平台和编译器有关的,
而C的标准库里定义的 uint32_t, uint16_t, uint8_t 就是为了保证平台无关性。 ejaVuSerif, 'DejaVu Serif', verdana, sans-serif;font-size:13px;line-height:19px;">
联合体确实用的很少,也不是必须用的联合体才能完成这个功能的,利用指针强制转换也可以完成同样的功能的。
|