位结构体实现C中的长度截断+符号位扩展 您所在的位置:网站首页 c语言符号扩展 位结构体实现C中的长度截断+符号位扩展

位结构体实现C中的长度截断+符号位扩展

2024-07-14 02:29| 来源: 网络整理| 查看: 265

背景

在做一生一芯的过程中,有一个隐蔽的bug找了好久,发现是由于不懂位结构体的操作。为了便于回忆,简要进行分析

代码 #define SEXT(x, len) ({ struct { int64_t n : len; } __x = { .n = x }; (uint64_t)__x.n; }) #define SEXT(x, len) ({ struct { int64_t n : len; } __x = { .n = x }; (uint64_t)__x.n; })

可以整理成下面的形式进行分析,首先采用宏定义的形式,#define 关键一句在于‘int64_t n : len 表示只取n的后len位,对应于verilog的[len-1:0]位 通过‘(uint64_t)__x.n; ,将len位的数据进行符号位扩展,符号位为n[len-1]的数据。 并返回该值。

如果不采用这种方式进行符号位扩展的话,就会按照最高位为1的进行扩展,得到所有高位都是1,这种并不是我们想要的,比如一个10为的二进制数据:0010010101,扩展成16位,就会得到1111111110010101。这种不是我们要的结果。 如果按照上文提供的位结构体实现,就会得到0000000010010101,这才是我们想要的结果。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有