gpt4 book ai didi

c - c 标准是否保证有符号和无符号的位模式解释?

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:58 24 4
gpt4 key购买 nike

C 标准是否规定了应如何解释位表示?换句话说,如果条件总是评估为真,请执行以下操作?假设 sizeof (int) = 4 和 CHAR_BIT = 8

unsigned u = 0xffffffff;
if (u == 4294967295) /* do something */

int i = 0xffffffff;
if (i == -1) /* do something */

unsigned u = (int)0xffffffff;
if (u == 0xffffffff) /* do something */

int i = hex_literal;
unsigned u;
memcpy (&u, &i, sizeof (u));
if (i == u) /* do something */
if ((i & 0x7fffffff) == (u & 0x7fffffff)) /* do something */

int i = hex_literal;
unsigned u = i;
if (i == u) /* do something */

unsigned u = hex_literal;
int i = u;
if (i == u) /* do something */

int i = hex_literal;
unsigned u = hex_literal;
if (i == hex_literal && u == hex_literal) /* do something */

char c = 0xff;
if (c >> 4 == 0xf) /* do something */

signed char c = 0xff;
if (((c >> 4) & 0xff) == 0xf) /* do something */

最佳答案

我将做出额外的假设,即在所讨论的实现中没有类型具有填充位。让我们一次一个地处理它们:

unsigned u = 0xffffffff;
if (u == 4294967295) /* do something */

是的。

int i = 0xffffffff;
if (i == -1) /* do something */

没有。将超出范围的数字转换为有符号类型会产生实现定义的结果。

unsigned u = (int)0xffffffff;
if (u == 0xffffffff) /* do something */

不是,和前面的例子一样。

int i = hex_literal;
unsigned u;
memcpy (&u, &i, sizeof (u));
if (i == u) /* do something */
if ((i & 0x7fffffff) == (u & 0x7fffffff)) /* do something */

是的。该标准保证有符号类型中的每个值位在相应无符号类型的对象表示中具有相同的值。

int i = hex_literal;
unsigned u = i;
if (i == u) /* do something */

是的。 iintunsigned 的提升是确定性的,并且在对 u 和在比较中。

unsigned u = hex_literal;
int i = u;
if (i == u) /* do something */

是的,但前提是 hex_literalint 可表示的(正)值范围内 - 否则实现定义的结果再次出现。

int i = hex_literal;
unsigned u = hex_literal;
if (i == hex_literal && u == hex_literal) /* do something */

u == hex_literal 将始终计算为 true,但 i == hex_literal 仅当 hex_literal 在以下范围内时才需要这样做由 int 表示的值。

char c = 0xff;
if (c >> 4 == 0xf) /* do something */

char 可以是有符号的或无符号的。如果它是无符号的,那么测试将为真;如果已签名,则 cc >> 4 将具有实现定义的值,因此它可能不是真的。

signed char c = 0xff;
if (((c >> 4) & 0xff) == 0xf) /* do something */

c 将具有实现定义的值,因此测试可能不正确。

请注意,除了 memcpy() 问题之外,您的所有问题都只涉及,而不是表示

关于c - c 标准是否保证有符号和无符号的位模式解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7916939/

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