【问题标题】:Comparision between a signed/unsigned value with a negative value有符号/无符号值与负值的比较
【发布时间】:2015-10-31 15:13:48
【问题描述】:

方案一:

#include <stdio.h>
int main()
{
    if (sizeof(int) > -1)
        printf("Yes");
    else
        printf("No");
    return 0;
}

输出:No

方案二:

#include <stdio.h>
int main()
{
    if (2 > -1)
        printf("Yes");
    else
        printf("No");
    return 0;
}

输出:Yes

问题:

  1. 方案一和方案二有什么区别?
  2. 为什么sizeof(int)被认为是unsigned?
  3. 为什么程序 2 中的 2 被视为 signed?

【问题讨论】:

标签: c sizeof unsigned signed


【解决方案1】:

有符号和无符号整数之间的通常算术转换是常见问题。 sizeof 运算符返回 size_t 类型的值,这是一些实现定义的无符号整数类型,在 &lt;stddef.h&gt; 中定义(另见 this answer)。

整数常量-1 的类型为int。当size_t 被实现为“至少”unsigned int(这在您的情况下很可能发生)时,二元运算符&lt; 的两个操作数都将转换为无符号类型。无符号值不能为负数,因此-1 被转换为一个大数。

【讨论】:

    【解决方案2】:

    sizeof 运算符返回的值的类型为size_t,指定为无符号类型(通常等价于unsigned long)。

    简单的纯整数文字,如@9​​87654324@ 或-1,总是属于int 类型,而int 是有符号的。

    如果你想要一个无符号整数文字,你必须添加U 后缀,比如2U。

    【讨论】:

    • "and int is signed" -- int 是 signed 还是 unsigned 不是实现定义的吗?
    • @CoolGuy Yoiu 正在考虑char,所有其他整数类型都是有符号的。
    • @Cool Guy @JoachimPileborg:或者int 位域。
    • 不熟悉术语“整数文字”。整数 decimal 常量始终为 int, long 或 long long。整数 十六进制 常量是 int, unsigned, long, unsigned long, long long 或 unsigned long long。代码可以有一个 unsigned 常量,而没有像 32 位世界中的 0xFFFFFFFF 这样的 u 后缀。
    • @chux 文字是直接嵌入代码中的任何常量值,因此您可以使用 'A' 之类的字符文字、"Foo" 之类的字符串文字、12.34 之类的浮点文字,当然还有整数文字,如 5678。其中一些文字可以在源代码中以不同的格式表示,对于整数文字,可以使用十进制表示法(默认)、十六进制、八进制和最近的二进制表示法。
    【解决方案3】:

    这是因为sizeof 运算符返回size_t 中的值。这应该是一个无符号类型,通常实现为unsigned int。

    号码2 本身是int,而不是unsigned int。

    【讨论】:

      猜你喜欢
      • 2019-07-11
      • 1970-01-01
      • 2012-09-30
      • 2011-07-21
      • 2012-07-28
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多