请教C语音隐形转换问题
如:unsigned char data1=0x12;
unsigned long data2=0x34;
data2=data1<<8;
data2此时的值为? 要看 cpu 和编译器,譬如 stm8 就要明转为 long 否则超出 8 bit 数据丢失,如果是 PC 或 STM32 则不会丢。基本上是 CPU 位宽以内隐转即可。 0x00001200 没有疑义的。 本帖最后由 jxcrgt35 于 2019-7-13 19:46 编辑
dukelec 发表于 2019-7-13 19:37
要看 cpu 和编译器,譬如 stm8 就要明转为 long 否则超出 8 bit 数据丢失,如果是 PC 或 STM32 则不会丢。 ...
应该是这样?觉得你说的对,和编译器有关。原觉得是隐形转换的
data2=(unsigned long )data1<<8; 本帖最后由 lcofjp 于 2019-7-13 22:19 编辑
data1是unsigned char类型,但是整型运算至少会转成int再进行运算,因此结果也是个int型,0x1200应该就是这个结果 jxcrgt35 发表于 2019-7-13 19:45
应该是这样?觉得你说的对,和编译器有关。原觉得是隐形转换的
data2=(unsigned long )data1 ...
是的,反正 stm8 用 iar 编译,不明转会丢数据。印象深刻。 编译器大有关系 本帖最后由 jxcrgt35 于 2019-7-13 20:12 编辑
lcofjp 发表于 2019-7-13 19:46
data1是unsigned char类型,但是整型运算至少会转成int再进行运算,因此结果也是个int型,0x1200应该就是这 ...
还是强制转换保险。不管什么编译器 这种情况,我一般是先赋值,然后在自己左移。 jxcrgt35 发表于 2019-7-13 20:10
还是强制转换保险。不管什么编译器
你可找出不是0x1200这个结果的,然后咱们再讨论{:lol:} lcofjp 发表于 2019-7-13 22:20
你可找出不是0x1200这个结果的,然后咱们再讨论
感谢回复 ztrx 发表于 2019-7-14 08:18
自己试过,编译环境为KEILc51,为1200H,默认为INT型转换。运用时还是加上强制转换为好 看你器件的类型,8位机char就是8bit,左移8位再赋值就是0.
16,32位的芯片,有些char是16bit的,左移8位再赋值就是0x1200。实际就是和编译器有关了
页:
[1]