jxcrgt35 发表于 2019-7-13 19:29:28

请教C语音隐形转换问题

如:
unsigned char data1=0x12;
unsigned long data2=0x34;

data2=data1<<8;

data2此时的值为?

dukelec 发表于 2019-7-13 19:37:22

要看 cpu 和编译器,譬如 stm8 就要明转为 long 否则超出 8 bit 数据丢失,如果是 PC 或 STM32 则不会丢。基本上是 CPU 位宽以内隐转即可。

TANK99 发表于 2019-7-13 19:40:05

0x00001200 没有疑义的。

jxcrgt35 发表于 2019-7-13 19:45:01

本帖最后由 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 19:46:56

本帖最后由 lcofjp 于 2019-7-13 22:19 编辑

data1是unsigned char类型,但是整型运算至少会转成int再进行运算,因此结果也是个int型,0x1200应该就是这个结果

dukelec 发表于 2019-7-13 19:51:22

jxcrgt35 发表于 2019-7-13 19:45
应该是这样?觉得你说的对,和编译器有关。原觉得是隐形转换的
data2=(unsigned long )data1 ...

是的,反正 stm8 用 iar 编译,不明转会丢数据。印象深刻。

lb0857 发表于 2019-7-13 19:59:53

编译器大有关系

jxcrgt35 发表于 2019-7-13 20:10:04

本帖最后由 jxcrgt35 于 2019-7-13 20:12 编辑

lcofjp 发表于 2019-7-13 19:46
data1是unsigned char类型,但是整型运算至少会转成int再进行运算,因此结果也是个int型,0x1200应该就是这 ...

还是强制转换保险。不管什么编译器

saccapanna 发表于 2019-7-13 21:43:00

这种情况,我一般是先赋值,然后在自己左移。

lcofjp 发表于 2019-7-13 22:20:15

jxcrgt35 发表于 2019-7-13 20:10
还是强制转换保险。不管什么编译器

你可找出不是0x1200这个结果的,然后咱们再讨论{:lol:}

jxcrgt35 发表于 2019-7-14 00:30:46

lcofjp 发表于 2019-7-13 22:20
你可找出不是0x1200这个结果的,然后咱们再讨论

感谢回复

ztrx 发表于 2019-7-14 08:18:06

jxcrgt35 发表于 2019-7-14 22:57:19

ztrx 发表于 2019-7-14 08:18


自己试过,编译环境为KEILc51,为1200H,默认为INT型转换。运用时还是加上强制转换为好

liansh2002 发表于 2019-7-15 08:29:31

看你器件的类型,8位机char就是8bit,左移8位再赋值就是0.
16,32位的芯片,有些char是16bit的,左移8位再赋值就是0x1200。实际就是和编译器有关了
页: [1]
查看完整版本: 请教C语音隐形转换问题