一百零五

我的代码是:

#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;
}

输出:

$ clang -Wall -Wextra -pedantic -std=c89 foo.c && ./a.out
-2 254
-2 254

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

推荐答案

C89中从unsigned charsigned char的转换是否定义良好?

unsigned种类型的转换是定义良好的.到signed类型中有实现的详细信息.

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

不是的.

或者,输出取决于实现吗?

是.


并不是所有的实现都使用8位char,转换为signed类型会产生实现细节.

规格详情:C89 Conversions.这一措辞不同于最新的C规范.我没有发现显著的区别.


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

c = (signed char) (d > SCHAR_MAX ? d - UCHAR_MAX - 1 : d);

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

C++相关问答推荐

理解C中的指针定义

如何将匿名VLA分配给指针?

如何启用ss(另一个调查套接字的实用程序)来查看Linux主机上加入的多播组IP地址?

使用单个字节内的位字段

ESP32在vTaskDelay上崩溃

为什么删除CAP_DAC_OVERRIDE后创建文件失败?

`#if`条件中是否允许`sizeof`?

插座打开MacOS组件

强制转换变量以在 struct 中蚕食

C I/O:在Windows控制台上处理键盘输入

如何在GDB中查看MUSL的源代码

编译器如何处理具有更复杂值的枚举?

C代码在字符串中删除不区分大小写的子字符串的问题

使用ld将目标文件链接到C标准库

为什么我无法访问C语言中的文件

为什么GCC 13没有显示正确的二进制表示法?

在我的函数中实现va_arg的问题

C中2个数字的加法 - 简单的人类方法

关于不同C编译器中的__attribute__支持

与 C 相比,C++ 中无副作用的无限循环的好处是 UB?