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