README
A "trap value", or "trap representation" for typeT
, is a bit combination (of the underlying storage) that yields an invalid value ofT.
Trying to interpret the representation of an invalid value will cause undefined behavior.
让战斗开始吧..
另一个 question已经开始了关于 char
的激烈讨论,以及具有 trap representations 的实现的可能性为它。
问题:
char
可能有陷阱值吗?
前面讨论中提到的引语:
这些部分是之前论证中引用最多的部分,它们是否相互矛盾?
3.9.1p1
Fundamental types[basic.fundamental]
It is implementation-defined whether a
char
can hold negative values. Characters can be explicitly declaredsigned
orunsigned
.A
char,
asigned char,
and anunsigned char
occupy the same amount of storage and have the same alignment requirements (3.11); that is, they have the same object representation. For character types, all bits of the object representation participate in the value representation.For unsigned character types, all possible bit patterns of the value representation represent numbers. These requirements do not hold for other types.
In any particular implementation, a plain
char
object can take on either the same values as asigned char
or anunsigned char;
which one is implementation-defined.
3.9p2 Types
[basic.types]
For any object (other than a base-class subobject) of trivially copyable type
T,
whether or not the object holds a valid value of typeT
, the underlying bytes (1.7) making up the object can be copied into an array ofchar
orunsigned char.
If the content of the array of
char
orunsigned char
is copied back into the object, the object shall subsequently hold its original value.
最佳答案
标准告诉我们必须有:
- char、signed char、unsigned char,大小都一样
- sizeof(char) 为 1
- char 至少有 8 位
- 每一个比特组合都是有意义且有效的
- char 数组已打包(如果是,则行为是)。
没有太多的回旋余地。
尽管如此,还是有建议在某些类型的操作期间,例如加载未初始化的内存或转换为陷阱。
是的,我认为一个实现可能有一个陷阱表示,其中陷阱值可能由于某种未定义或未指定的行为而出现,包括评估涉及未指定/未初始化值的表达式。导致陷阱值的实际位模式对实现来说是不可见的。
这样的 CPU 可能有 9 位字节,其中只有 8 位对编译器和运行时可见,第 9 位用于检测未初始化的内存,如果被(非特权)指令加载,将触发陷阱。
关于c++ - 一个普通的 `char` 可能有陷阱值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24034296/