当前位置: 首页 > 知识库问答 >
问题:

已签署

谭裕
2023-03-14

在定点数学中,我使用了大量16位信号,并用32位中间结果进行乘法运算。例如:

int16_t a = 16384; //-1.0q14  or 1.0*2^14
int16_t b = -24576; // -1.4q14  or 1.4*2^14
int16_t c; // result will be q14

c = (int16_t)(((int32_t)a * (int32_t)b)>>14);

假设a是一个q14数,那么c与b的比例相同。

这很好,适用于有符号和无符号算术。

问题是:如果我混合类型会发生什么?例如,如果我知道乘数“a”总是在 0.0 到 1.0 之间,那么很容易使其成为无符号的 int q15 以获得额外的精度(并将移位计数更改为 15)。但是,我从来不明白如果您尝试在 C 中将有符号和无符号数字相乘并避免使用它会发生什么。在ASM中,我不记得有一条乘法指令可以在任何html" target="_blank">架构上处理混合类型,所以即使C做了正确的事情,我也不确定它会生成有效的代码。

我应该继续我的做法,不在定点代码中混合有符号和无符号类型吗?或者这能很好地工作吗?

共有2个答案

崔宜修
2023-03-14

我也有类似的问题。它在x64版本中导致访问冲突崩溃。代码在图像扫描行的缓冲区中迭代。获取下一个扫描线指针如下:

unsigned char* pImg = ...
int stride = -3324;
unsigned int iRow = 1; // 2, 3, 4, ...
unsigned char* pNextLine = pImg + stride * iRow

负步幅意味着从底部向顶部扫描线迭代。产品跨步*iRow有符号*无符号被类型化为无符号__int64,值4294963972pNextLine推出程序内存。

< code>x32程序版本也会发生同样的情况,但是没有崩溃。可能是因为< code > x32 < code > pNextLine 指针只是回绕(但停留在程序的内存中)。

公孙胡媚
2023-03-14

这篇文章讲述了将有符号和无符号整数相乘时会发生什么。简单的答案是,只要它们的等级(大小)相同,有符号就隐式地类型转换为无符号。

只要您了解类型转换规则(无论您使用哪种语言编程),或者使用显式类型转换,并且您还了解从有符号到无符号的类型转换的含义(负数将产生当类型转换为有符号值时可能看起来像胡言乱语的东西),那么混合有符号和无符号类型应该没有问题。

 类似资料:
  • null 无论我用电子邮件发送apks还是用USB安装apks,问题仍然存在。

  • 问题内容: 我想使用Bouncycastle生成一个简单的CMS签名。此代码有效! 但是,如何添加签名属性? 我想删除默认的签名属性并添加signature-policy-identifier。 文章非常受欢迎。 问题答案: 首先,您似乎正在使用最新版本的Bouncy Castle中不推荐使用的构造。要添加经过身份验证/签名的属性,您必须将它们打包到AttributeTable中,将签名的属性添加

  • 问题内容: 我正在尝试在Java + JSF项目中签署对象。 到目前为止,我所做的是创建自己的X509证书以及具有XCA的CA,并将它们都安装在Firefox和Chrome上。 我一直在搜索3天,我如何才能访问它进行签名(如果您安装了多个证书,典型的弹出窗口会要求选择证书),但是我找不到有用的东西。我已经多次看到此代码行: 但是我不知道从哪里可以得到带有证书的请求。 1) 我在哪里可以收到该请求?

  • web3.eth.sendSignedTransaction()方法用来发送已经签名的交易,例如,可以使用web3.eth.accounts.signTransaction() 方法进行签名。 调用: web3.eth.sendSignedTransaction(signedTransactionData [, callback]) 参数: signedTransactionData:Strin

  • 您好,我可以使用iText 5对PDF文档进行数字签名。我需要再次签署PDF,而在验证PDF时,它表明初始签名无效。您可以在此处查看再次签名的文件。 请参见下面用于标记的代码, 请让我知道出了什么问题。