C中的Int8到Int16的转换

C中的Int8到Int16的转换,c,integer,C,Integer,我有一个C代码在我的项目。在一些代码中,我直接使用了从int8到int32的转换,并进行了多空间分析 在polyspace分析中,它说这很容易出错,我需要首先将其转换为char,而不是int32\t。我不太明白为什么需要这样做 我在下面的链接中也看到了类似的表达: 在分配或转换为较大的有符号类型之前,必须将有符号字符数据转换为无符号字符。此规则适用于定义字符与有符号字符具有相同范围、表示和行为的实现中的有符号字符和(普通)字符。 我用Dev-C在我的电脑上尝试了相同的转换 我的代码是: #in

我有一个C代码在我的项目。在一些代码中,我直接使用了从int8到int32的转换,并进行了多空间分析

在polyspace分析中,它说这很容易出错,我需要首先将其转换为char,而不是int32\t。我不太明白为什么需要这样做

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

在分配或转换为较大的有符号类型之前,必须将有符号字符数据转换为无符号字符。此规则适用于定义字符与有符号字符具有相同范围、表示和行为的实现中的有符号字符和(普通)字符。

我用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);
}
#包括
#包括
真空总管(真空)
{
int8_t b=-3;
int32_t b_32=(int32_t)b;
printf(“%d\n”,b);
printf(“%d\n”,b_32);
}
而且输出似乎不存在任何问题:

-三,

-三,

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

所以,我看这里没问题。为什么需要转换成字符

谢谢。

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


由于您正在处理实际的有符号数字,请忽略此建议,直接从
int8\u t
转换为
int32\u t
如果您阅读链接到的参考CERT-C规则,实际需要考虑的是在算术或存储原始值时使用
char
键入。他们还关注隐式类型提升。有关这些问题的更多信息,请参阅这些帖子:



表达式
int32_t b_32=(int32_t)b中不存在与字符的符号性或隐式整数提升相关的问题。值得注意的是,
b
不是
char
类型。无需转换为无符号-代码很好。演员阵容也不需要。您的工具给出的是假阳性。

int8\u t
是一种表示8位有符号整数的类型,而不是“字符”。您是否尝试将主函数签名更改为返回
int
,而不是
void
?4的出境代码可能与签名有关;谢谢,但实际上我的问题是围绕数据类型连接来解决的。但无论如何还是要感谢。当您意识到问题在于当您的
b
的值为-3时,您的示例代码希望看到值253时,您的示例代码正好说明了问题。我使用Polyspace Bug Finder和Polyspace code Prover R2021a尝试了您的代码,MISRA-C:2012和CERT-C编码规则检查器激活后,该工具不会出现问题。知道你到底在哪里发现了这个问题是很有用的。而且,你甚至不需要演员组来做这样的赋值:
int32_t b_32=b这也可以。“文本字符”可以是负数;C标准要求某些字符为正数,但允许其他字符为负数(尽管它为某些函数调用
无符号字符
值,例如
中的值)。这里的问题是OP使用的软件只需要非负值。这是特定于他们的情况,而不是一般规则。@EricPostphil在权威标准ISO8859中,代码点是正值。C允许实现对
char
进行签名,但这不会改变绑定从数字到可视表示的选择。关键区别在于
char
(明确指定的抽象数据类型的名称)和“文本字符”(明确地说,人类可以读取的符号名称)。@Potatoswatter:C不需要ISO 8859。导致人类可以读取符号的可打印字符在C中的编码可能是负值。@EricPostChil重点是这不是一个纯粹的语言问题。这是一个将语言应用于文本处理而不是应用于数学处理的问题。