double ←── float 高
↑
long
↑
unsigned
↑
int ←── char,short 低
1.如一个int 型数据与一个unsigned型数据一起运算,需要先将int型数据转换为unsigned型, 然后两者再进行运算,结果为unsigned型。所有这些转换都是由系统自动转换
2.一个大于0x80的char型,由于最高位代表符号位,于是数据在实际上是显示为补码形式的 0xffffff80。
也就是 0x80 取反 +1 后的值。
例如,linux dts of_property_read_u32读取到的数据为int型。
如果这些数据要写入寄存器的时候,例如 static void spi_send_cmds(struct sprd_spi *spi, int8_t *data, uint16_t len)
将写进去的数据仍是 有符号位的整型。实际上应该类型转换成无符号数据
举个例子
1 #include <stdio.h>
2
3 int main()
4 {
5 char a;
6 char b = 0xe2;
7 char c = 0x80;
8 a=b;
9 printf("%x %x %x\n", a, b, c);
10 printf("%x %x %x\n", (unsigned char)a, (unsigned char)b, (unsigned char)c);
11 printf("%c %c %c\n", a, b, c);
12
13
14 return 0;
15 }
ffffffe2 ffffffe2 ffffff80
e2 e2 80
上面说明了,当char大于0x80时,最高位实际上是符号位,则显示的是 ffffff80 补码。
这样实际上对数据处理是存在问题的。
也就是说,一般情况下,需要注意数据类型,尽量是无符号数