C89 中从无符号字符到有符号字符的转换(反之亦然)是否定义良好?

Lon*_*ner 5 c c89 undefined-behavior

注意:建议的重复项处理的是unsigned intand signed int,而不是unsigned charsigned char。建议的重复问题涉及 C11。这个问题只与C89有关。这个问题可以重新讨论吗?

我的代码:

#include <stdio.h>

int main()
{
    signed char c;
    unsigned char d;

    c = (signed char) -2;
    d = (unsigned char) c;
    printf("%d %d\n", c, d);

    d = (unsigned char) 254;
    c = (signed char) d;
    printf("%d %d\n", c, d);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ clang -Wall -Wextra -pedantic -std=c89 foo.c && ./a.out
-2 254
-2 254
Run Code Online (Sandbox Code Playgroud)

对于上面显示的两种转换,输出是否保证-2 254在符合标准的 C89 编译器中?或者输出取决于实施?

chu*_*ica 4

unsigned charC89 中从到 的转换signed char以及反之亦然是否定义明确?

到无符号类型的转换是明确定义的。签名类型具有实现细节。

对于上面显示的两种转换,在符合标准的 C89 编译器中输出是否保证为 -2 254?

不。

或者输出取决于实施?

是的。


并非所有实现都使用 8 位,并且到有符号char类型的转换会产生实现细节。

规格详细信息:C89 转换。此措辞与最近的 C 规范不同。我还没有发现显着差异。


当 时UCHAR_MAX <= INT_MAX,代码可以使用下面的代码并让编译器发出优化的、定义良好的代码。

c = (signed char) (d > SCHAR_MAX ? d - UCHAR_MAX - 1 : d);
Run Code Online (Sandbox Code Playgroud)

可能需要更多思考才能涵盖所有情况。