C语言中short int的移位操作

11 篇文章 0 订阅
5 篇文章 0 订阅
	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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值