gpt4 book ai didi

c - "representable"在 C11 中是什么意思?

转载 作者:太空狗 更新时间:2023-10-29 17:16:45 31 4
gpt4 key购买 nike

根据 C11 WG14 draft version N1570 :

The header <ctype.h> declares several functions useful for classifying and mapping characters. In all cases the argument is an int, the value of which shall be representable as an unsigned char or shall equal the value of the macro EOF. If the argument has any other value, the behavior is undefined.

这是未定义的行为吗?:

#include <ctype.h>
#include <limits.h>
#include <stdlib.h>

int main(void) {
char c = CHAR_MIN; /* let assume that char is signed and CHAR_MIN < 0 */
return isspace(c) ? EXIT_FAILURE : EXIT_SUCCESS;
}

标准是否允许通过charisspace() ( charint )?换句话说,是 char转换为 int可表示unsigned char


这是如何wiktionary defines "representable" :

Capable of being represented.

char能够表示为 unsigned char。 §6.2.6.1/4:

Values stored in non-bit-field objects of any other object type consist of n × CHAR_BIT bits, where n is the size of an object of that type, in bytes. The value may be copied into an object of type unsigned char [n] (e.g., by memcpy); the resulting set of bytes is called the object representation of the value.

sizeof(char) == 1因此它的对象表示是unsigned char[1]char能够表示为 unsigned char .我哪里错了?

具体例子,我可以表示[-2, -1, 0, 1]作为[0, 1, 2, 3] .如果我不能,那为什么?


相关:根据§6.3.1.3 isspace((unsigned char)c)如果 INT_MAX >= UCHAR_MAX 是可移植的否则它是实现定义的。

最佳答案

What does representable in a type mean?

重新表述,类型是底层位模式含义的约定。因此,一个值可以用一种类型来表示,如果该类型分配了一些具有该含义的位模式。

转换(可能需要强制转换)是从值(用特定类型表示)到目标类型中表示的值(可能不同)的映射。


在给定的假设下(char 是有符号的),CHAR_MIN 肯定是负数,您引用的文本没有解释的余地​​:
是的,这是未定义的行为,因为 unsigned char 不能表示任何负数。

如果该假设不成立,您的程序将是明确定义的,因为 CHAR_MIN 将是 0unsigned char 的有效值>.

因此,我们有一种情况,无论程序是未定义的还是定义良好的,都是实现定义的。


顺便说一句,不能保证 sizeof(int)>1INT_MAX >= CHAR_MAX,所以 int 可能不是能够表示 unsigned char 的所有可能值。

由于转换被定义为保值,一个有符号的 char 总是可以转换为 int
但如果它是负数,这不会改变将负值表示为 unsigned char 的可能性。 (转换是定义的,因为从任何整数类型到任何 unsigned 整数类型的转换始终是定义的,尽管缩小转换需要强制转换。)

关于c - "representable"在 C11 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25776824/

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