隐式类型转换

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 补码。

这样实际上对数据处理是存在问题的。

 

也就是说,一般情况下,需要注意数据类型,尽量是无符号数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值