gpt4 book ai didi

c - 使用函数指针时加法符号不正确

转载 作者:行者123 更新时间:2023-11-30 18:15:24 25 4
gpt4 key购买 nike

使用arm-none-eabi-gcc,以下程序根据编译器优化级别提供不同的输出:

#include <stdio.h>

unsigned short p = 100;

void f(signed char o) {
// o is signed, so 0xfc should be interpreted as -4 here, but it is not always
p += o;
}

int main(void) {
void (*fp)(unsigned char o);
fp = (void (*)(unsigned char))f;

printf("%d\n", p);

fp(0xfc);

printf("%d\n", p);

return 0;
}

使用-O0输出(期望): 100 96

带有-O2的输出(不需要): 100 352

我希望程序在使用 -O2 时输出 96

使用-fwrapv-fno-strict-overflow没有影响。

我无法更改 fp 的类型,我希望 f 始终将第一个参数解释为 signed char (因此它看到 0xfc为-4)。

最佳答案

通过不同类型的指针调用函数是未定义行为

没有任何保证。编译器正在做“正确”的事情,因为任何事情都是允许的。

您说您无法更改 fp 的类型,因此修复方法是更改​​ f 的类型:

void f(unsigned char uo)
{
signed char o = (signed char)uo; // value is implementation-defined :(
p += o;
}

关于c - 使用函数指针时加法符号不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28976267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com