U16的转换与结果溢出。为什么?

58 Ansichten(30天)的
克里斯蒂娜Golie
克里斯蒂娜Golie 我2015年4月10
你好所有的,
我做了下面的例子:
类型定义unsigned int U16;
类型定义无符号字符与;
/ /情况下1;
U16一个= 0 x0fff;
U16b = 0 x0e00;
c = 0 x00;
/ /情况下2:
U16d = 0 xffff;
U16e = 0 x0011;
U16f = 0;
无效main ()
{/ /情况下1:
c =(与)(a - b);/ / - >红色的检查溢出
/ /情况下2:
f =(与)((d + e) &0x00FF);/ / +红色警告- > 0 x00ff没有影响
}
当我运行Polyspace(代码验证R2014b)分析,我收到以下红色的检查:
1)错误:操作[转换从无符号int16 unsigned int8]在标量溢出(结果总是严格大于MAX UINT8)转换从unsigned int 16 unsigned int 8
2)错误:操作[+]标量溢出(结果总是严格大于MAX UINT16)运算符+ 16 unsigned int类型
如果我改变的代码:
c =(与)(a - b);
c =(与)((a - b) &0x00FF);
我不接受第一个红色警告。这是正确的配置没有错误发生溢出?
1 Kommentar
提多Edelhofer
提多Edelhofer 我2015年4月22日
嗨,克里斯蒂娜,
是你的问题的答案回答亚历克斯和我吗?
提图斯

Melden您西奇,嗯祖茂堂kommentieren。

Akzeptierte Antwort

Alexandre De Barros
Alexandre De Barros 2015年4月13日上午
Bearbeitet:MathWorks支金宝app持团队 我2023年1月10
你好,
我也将增加,Polyspace是提高一个溢出因为在Polyspace项目,您指定一个选项来检测溢位无符号(见检查行为)。有关更多信息,请参见: //www.tatmou.com/help/codeprover/ref/overflowmodeforunsignedintegerunsignedintegeroverflows.html
C标准说没有溢出的无符号类型(一个全方位发生如果发生这种情况),但Polyspace可以比ANSI C标准更严格。
如果你想摆脱这种无符号溢出,你必须使用默认模式检测溢出(仅签署)。
最好的问候,
亚历山大
1 Kommentar
克里斯蒂娜Golie
克里斯蒂娜Golie 我2015年8月26日
你好,
谢谢你的信息。

Melden您西奇,嗯祖茂堂kommentieren。

Weitere Antworten (1)

提多Edelhofer
提多Edelhofer 我2015年4月10
Bearbeitet:提多Edelhofer 我2015年4月10
你好,
嗯,我想第一个错误是可说明的:你确实有一个溢出。
hex2dec (“0 fff”)-hex2dec (“0 e00”)
ans =
511年
这是超过255。这对与溢出当演员。
第二个错误也是正确的:你在U16 +操作溢出。做“&”之后没有帮助,因为错误发生在(d + e)。
最后但并非最不重要的是:
c =(与)((a - b) &0x00FF);
没有错误,因为(a - b)很好(这是在U16和b >)。“&”“删除”位大于255。然后铸造与是安全的。
提图斯

翻译的