Lon*_*ner 5 c c89 undefined-behavior
注意:建议的重复项处理的是unsigned intand signed int,而不是unsigned char和signed 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 编译器中?或者输出取决于实施?
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)
可能需要更多思考才能涵盖所有情况。
| 归档时间: |
|
| 查看次数: |
227 次 |
| 最近记录: |