Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 签署及;无符号整数乘法_C_Math_Types_Multiplication_Fixed Point - Fatal编程技术网

C 签署及;无符号整数乘法

C 签署及;无符号整数乘法,c,math,types,multiplication,fixed-point,C,Math,Types,Multiplication,Fixed Point,在定点数学中,我使用大量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具有相同的比例 这很好,适用于无符号和有符号算术 问题

在定点数学中,我使用大量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中,我不记得有一条乘法指令可以在任何体系结构上处理混合类型,因此即使C做了正确的事情,我也不确定它是否能生成高效的代码

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

讨论了有符号和无符号整数相乘时会发生什么情况。简单的回答是,只要它们的秩(大小)相同,有符号的就隐式地类型转换为无符号的


只要您了解类型转换规则(无论您使用何种语言编程),或使用显式类型转换,并且您还了解从有符号到无符号的类型转换的含义(当类型转换为有符号值时,负数将产生可能会出现的乱码),那么,混合使用有符号和无符号类型应该不会有问题。

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

unsigned char* pImg = ...
int stride = -3324;
unsigned int iRow = 1; // 2, 3, 4, ...
unsigned char* pNextLine = pImg + stride * iRow
负跨步意味着从底部向顶部扫描线迭代。产品
stride*iRow
signed*unsigned
被键入
unsigned\u int64
,值
4294963972
,将
pNextLine
从程序内存中推出


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

这篇文章将回答您关于有符号和无符号整数相乘时会发生什么的问题。简短的回答是,只要它们的级别(大小)相同,有符号的就隐式地类型转换为无符号。发布一个答案而不是注释,这样我就可以接受;-)由于某种原因,当时我认为我只是回答了你问题的一部分,所以我把它作为一个评论。现在我再看一遍,我不知道为什么我会这样想。谢谢在我的情况下,根据规则,混合类型将导致错误的结果。这正是我所担心的。你能用你输入到a和b中的精确值来编辑你上面的帖子吗?这些值会产生违反规则的结果吗?