【问题标题】:C/C++ underlying representation of char, unsigned char and signed charchar、unsigned char 和 signed char 的 C/C++ 底层表示
【发布时间】:2012-11-30 07:50:08
【问题描述】:

下面每个定义中的底层对象表示(位模式)是相同的吗?

char c = 240;
unsigned char c = 240;
signed char c = 240;

那么,signed-ness 仅在 c 用于表达式(或强制转换)时才重要?

【问题讨论】:

  • 如果 charsigned char 有未定义的行为,我不会感到惊讶。
  • @melpomene,我很确定签名溢出规则也适用于初始值。对于char,是否签名取决于实现。
  • 你的答案就在那里 - stackoverflow.com/questions/8385824/…
  • @chris:有符号溢出仅导致算术运算的未定义行为。赋值/初始化(即溢出有符号整数转换)不会产生未定义的行为。相反,它们会产生实现定义的结果。

标签: c++ c char undefined-behavior integer-overflow


【解决方案1】:

一般情况下,如果signed char 的范围不包括240,则说模式相同是不正确的。如果240 超出范围,则此溢出初始化的结果是实现定义的(并可能产生信号,请参见 6.3.1.3/3)。 char 初始化也是如此,如果它已签名。

该语言保证仅匹配signed charunsigned char 范围的公共部分的表示。例如。这保证产生相同的模式

char c = 10;
unsigned char c = 10;
signed char c = 10;

240 在一般情况下没有这样的保证(假设它超出范围)。

【讨论】:

  • 只是想知道,标准在哪里提到 signed char c = 240; 会发生什么?
  • @chris: In 6.3 Conversions -> 6.3.1.3 Signed and unsigned integers: 6.3.1.3/3 否则新类型有符号,值不能在其中表示;结果要么是实现定义的,要么是实现定义的信号。
  • 谢谢,我似乎仍然无法在 C++11 标准中找到任何关于它的内容:/ 看来您发布的整个部分都被核弹了或完全改写了。
  • @chris:哦,我实际上指的是 C 标准 (C99)。在 C++11 中,这将是 4.7/3
  • 虽然我确信你对于所有实际目的都是正确的,但看看 §3.9/4 和 §3.9.1/1 (C++11),我想知道:a) 虽然 OP 使用单词object representation,不就是我们需要了解的value representation吗? b) 标准是否真的保证 char/signed char/unsigned char 的值表示是相同的?顺便说一句,我认为上面评论中的 C99 引用也应该是答案的一部分。
猜你喜欢
  • 2017-03-27
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多