当前位置: 首页 > 知识库问答 >
问题:

为什么将'uint8_t'分配给'uint8t'会发出转换警告?

朱宜
2023-03-14

为什么这段C代码:

#include <stdint.h>

uint8_t do_foo() {
  uint8_t int8;
  int8 = 0x80;
  int8 = int8 + (uint8_t) 1;
  return int8;
}

给这个编译器警告?

$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
$ gcc -c -Wall -Wextra -Wconversion test.c
test.c: In function ‘do_foo’:
test.c:6:10: warning: conversion to ‘uint8_t’ from ‘int’ may alter its value [-Wconversion]
   int8 = int8 + (uint8_t) 1;
          ^

据我所知,右边的表达式绝对是uint8_t类型,而不是int类型。

共有2个答案

史骏祥
2023-03-14

为了简化编译器,最初定义的C只允许对五种数字类型进行算术运算:intunsigned intlongunsignedlong,这意味着编译器只需要知道执行每个算术运算符的五种方法。此外,在二补系统上,许多运算符可以对有符号和无符号整数类型使用相同的实现,因此只需要三种实现。尝试对除上述一种类型之外的任何类型或任何类型组合执行算术运算将导致“两个”操作数从上述列表转换为同一类型[左移位和右移位类型的右运算符独立于左运算符]。

尽管Standard已更改为将浮动添加到可以执行算术的类型列表中,但您的示例使用不在该列表中的类型uint8_t。通常,不在列表中的类型的值会转换为列表中第一个可以保存相应类型的所有值的类型,在您的情况下是int。将两个操作数提升到int类型的加法并执行加法后,编译器会在尝试将结果分配回较小的类型时抱怨。

杜翰林
2023-03-14

这是由于整数提升。

操作数小于 int。因此,它们被提升为int,并且在int中执行加

对于< code>int8的赋值,结果必须转换回导致警告的< code>uint8_t,因为该值可能不合适。

 类似资料:
  • 问题内容: 我一直在使用IIFE中和,并一直在使用的结构如下: 方法1: 但是,我经常看到以下情况,其中将变量分配给 方法2: 注意: 此问题 不是 关于此模式是什么或IIFE是什么。这与为什么要 在IIFE上 使用返回变量及其与Angular实践的关系有关。 在Angular方法1中工作正常,但是在我看到的许多原始JS示例中,都使用了方法2。我的假设是,封装在其中的任何内容都可以通过它进行调用。

  • 问题内容: 以下语句: 因错误而失败: 为什么在这里需要演员表? 我发现了几篇文章,解释了为什么您不能进行反向操作(将T分配给a),但这是显而易见的(可以理解)。 注意:我在Eclipse Luna下对此进行编码,所以我不知道这是Luna Quirk还是泛型中确实不了解的东西。 问题答案: 协方差vs协方差vs不变性 是 不变的 。 结果是, 是 不是一个亚型 的 在Java中,变量可以保存 相同

  • 问题内容: 我多次听说,在实例化对象时应该执行以下操作: “接口”名称=新的“类”(); 例如,针对实现的类链表: 实现许多接口,包括队列,双端队列等。上面的代码和 要么 为什么必须同时指定两次类型?似乎多余,但oracledocs似乎没有提及。 问题答案: 在Java 7中是多余的。可以将其重写为。 你想写类似的原因: 如果您改变主意,则可以为您提供以后更改数据收集的自由。这样,您的代码将更加灵

  • 问题内容: 我试图为对象类型分配一个lambda: 它给我一个错误的说法: 为什么会这样,怎么做? 问题答案: 这是不可能的。根据错误消息不是功能接口,即具有单个公共方法的接口,因此您需要使用引用类型,例如

  • 问题内容: 这是我在使用const时遇到的错误: 我的代码如下所示: 只有JSHint每次都警告我,代码才能正常工作。 问题答案: 当依赖ECMAScript 6功能(例如)时,应设置此选项,以使JSHint不会引发不必要的警告。 顾名思义,此选项告诉JSHint您的代码使用ECMAScript 6特定语法。 http://jshint.com/docs/options/#esversion 编辑

  • 问题内容: 在Java中: 抛出。为什么?为什么在这里投降?我不知道原因。 问题答案: 让我重命名您的班级,以使事情更加清楚。 -> 。 -> 。 仅仅因为你是一个人并不意味着你是一个人。你可能是一个。这就是将A强制转换为A的原因。 另一方面,每个是吗?答案是“是”。这就是为什么您 可以 编写如下代码: 要么 另外值得注意的是,您 可以 执行以下操作: 这样做的原因是您的变量实际上是在引用实例。因