1. uint8_t正常左移8位是0,但如果赋值给uint16_t就占uint16_t中高8位 (原因:未知,实际转换成32位?)
  2. |的意义:就是把data[1]赋值给低8位,原因:0|1 = 1 0|0 = 1
  3. 这也是一种大小端转换的方法
int main() {
	uint8_t data[2];
	uint16_t version;
	data[0] = 0x01;
	version = data[0] << 8;
	data[1] = data[0] << 8;
    printf("%04x \n",data[0]); //输出 0100
    printf("%04x \n",data[1]); //输出 0000
    printf("%04x \n",version); //输出 0100 
}
int main() {
	uint8_t data[2];
	uint16_t version;
	data[0] = 0x01;
	data[1] = 0x10;
	version = data[0] << 8 | data[1];
    printf("%04x",version); //输出 0110
}

因为char其实是按int存的
char其实存的是整数
计算机中变量的首地址都是按4字节(32位机器)或者8字节(64位机器)对齐的。
单个char变量还是占了一个整数的内存,存的也是整数
存在char转换为int的隐式转换

内存对齐?
不知道char和short在运算前自动转换为int的原因是不是内存对齐? //认为不是,原因就是char转换为int
原因:
https://www.huaweicloud.com/articles/0c0b7c13f4312edf8713e424ed82421a.html

1,基本数据类型自身的对齐值
对于char类型其自身对齐值为1;对于short类型为2;对于int、float、double类型,其自身对齐值为4(单位/byte)。

2,struct或class的自身对齐值
其成员中自身对齐值最大的那个值。如果某个成员是struct或class,找到这个成员的最大对齐值,然后与获取的类自身对齐值进行比较,较大的值就是最终的自身对齐值

tps://zhuanlan.zhihu.com/p/30007037

  1. 什么是内存对齐
    还是用一个例子带出这个问题,看下面的小程序,理论上,32位系统下,int占4byte,char占一个byte,那么将它们放到一个结构体中应该占4+1=5byte;但是实际上,通过运行程序得到的结果是8 byte,这就是内存对齐所导致的。
//32位系统
#include<stdio.h>
struct{
    int x;
    char y;
}s;

int main()
{
    printf("%d\n",sizeof(s);  // 输出8
    return 0;
}

现代计算机中内存空间都是按照 byte 划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但是实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐

  1. 为什么要进行内存对齐
    尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称为内存存取粒度.

现在考虑4字节存取粒度的处理器取int类型变量(32位系统),该处理器只能从地址为4的倍数的内存开始读取数据。

假如没有内存对齐机制,数据可以任意存放,现在一个int变量存放在从地址1开始的联系四个字节地址中,该处理器去取数据时,要先从0地址开始读取第一个4字节块,剔除不想要的字节(0地址),然后从地址4开始读取下一个4字节块,同样剔除不要的数据(5,6,7地址),最后留下的两块数据合并放入寄存器.这需要做很多工作.

现在有了内存对齐的,int类型数据只能存放在按照对齐规则的内存中,比如说0地址开始的内存。那么现在该处理器在取数据时一次性就能将数据读出来了,而且不需要做额外的操作,提高了效率。

从 char 到 int 属于“从短到长”的转换,而从 int 到 char 则为“从长到短”的转换。
短到长时,系统会自动提升,会将1个字节的char类型数据扩充到4个字节(32位系统),对于无符号类型来说,只将int的最低字节复制为char的值,其余三个字节都为0
长到短时,只将int的最低字节的内容复制到char类型的变量,三个高位字节被忽略,这在编译时会给出警告,但通过强制类型转换则可以避免警告出现,如 char ch = (char)int var

https://www.nowcoder.com/questionTerminal/47cd46df31e0445996787b2c27eafd96?toCommentId=17119

lua byte左移8位_自动转换


头表示, 在运算之前必须转换的; 竖向的箭头表示运算过程中默认转换的顺 序,也就是说, float 类型的数据在运算之前,都转换为 double 类型的数据进行运算,同理, short 和 char 类型的数据在运算之前, 都是转换为 int 类型的数据进行运算。

这里面涉及到了默认类型转换:当出现在表达式里时,有符号和无符号的char和short都会被自动转换为int类型,在需要的情况下,将自动转换为unsigned int类型,在K&C中(不是当前的C)中,float会被自动转换为double类型。