为什么这段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
类型。
do_foo()
的返回值。它返回int类型,这就是引发警告的原因。所以在返回语句中,uint8_t会被隐式转换成do_foo()的返回类型,也就是int类型!编辑:抱歉,那是另一个问题,数字1是int类型,并且int类型是32位的。所以这个int类型将被转换为uint8,但很遗憾我现在无法使用编译器,但我猜这就是问题所在。 - mvdwerve1
)的值,因此没有理由相信转换(“向下转换”)会改变该值。 - undur_gongor