繁体   English   中英

C 中的 Int8_t 到 Int16_t 转换

[英]Int8_t to Int16_t Conversion in C

我的项目中有一个 C 代码。 在某些代码中,我直接使用了从 int8_t 到 int32_t 的转换,并进行了 Polyspace 分析。

在多空间分析中,它说这很容易出错,我需要先转换为char而不是int32_t。 我不太明白为什么需要这样做。

我也在下面的链接中看到了类似的表达,它说:

有符号字符数据必须先转换为无符号字符,然后才能分配或转换为更大的有符号类型。 此规则适用于在 char 被定义为具有与有符号字符相同的范围、表示和行为的实现上的有符号字符和(纯)字符字符。 来源网站

我用 Dev-C 在我的电脑上尝试了同样的转换

我的代码是:

#include <stdio.h>
#include <stdint.h>
void main(void)
{
    int8_t b = -3;
    int32_t b_32 = (int32_t) b;
    printf("%d \n",b);
    printf("%d \n",b_32);
}

而 output 似乎没有问题存在:

-3

-3

进程在 0.0807 秒后退出,返回值 4 按任意键继续。 . .

所以,我看这里没问题。 为什么需要转换为 char?

谢谢。

当他们说“字符数据”时,他们指的是文本。 文本字符不能为负数,因此他们提供了有关确保例如 ISO 8859 格式的代码保持在 0-255 范围内的提示。

由于您正在处理实际的签名数字,因此请忽略建议并直接从int8_tint32_t

如果您阅读了您链接到的引用 CERT-C 规则,则实际关注的是在算术或存储原始值时使用char类型。 他们还关心隐式类型提升。 有关这些问题的更多信息,请参阅这些帖子:

char 默认是有符号还是无符号?
隐式类型提升规则

您的表达式int32_t b_32 = (int32_t) b; . 值得注意的是, b不是char类型。 无需转换为无符号 - 代码很好。 演员阵容也不需要。 您的工具给出了误报。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM