SINT16 s16_val = fpga_spi_read(reg, addr);
printf("value = %d\n", s16_val);
新同事问我一个问题,说FPGA给的9-bit有符号数,打印出来是个正数。我一看,9 bit的有符号数对short来说接收下来高7位肯定全是0,于是想当然地帮他改成了:
SINT16 s16_val = fpga_spi_read(reg, addr);
s16_val = (s16_val << 7) >> 7;
printf("value = %d\n", s16_val);
自己感觉没什么问题,结果打印出来还是一样。我没办法,改成用signed int接收:
SINT32 s32_val = fpga_spi_read(reg, addr);
s32_val = (s32_val << 23) >> 23;
printf("value = %d\n", s32_val);
这样打印出来的9 bit负数会正常显示了,但还是没想通上一个为什么不行,直到我后来在MinGW下又试了下(利用gcc下的typeof语法):
short a = 0x0fee;
typeof(a << 4) b;
printf("sizeof(b) = %d", sizeof(b));
结果是4。也就是说short经过一次移位运算后返回值是int,不是short。
所以上述问题就可以这样解决:
SINT16 s16_val = fpga_spi_read(reg, addr);
s16_val = ((short)(s16_val << 7)) >> 7;
printf("value = %d\n", s16_val);
或者这样:
SINT16 s16_val = fpga_spi_read(reg, addr);
s16_val <<= 7;
s16_val >>= 7;
printf("value = %d\n", s16_val);