【问题标题】:How is a negative character stored in memory? [duplicate]否定字符如何存储在内存中? [复制]
【发布时间】:2018-11-14 05:53:24
【问题描述】:
#include <stdio.h>
int main()
{
    int i = 23;
    char c = -23;
    if (i < c)
        printf("Yes\n");
    else
        printf("No\n");
}

这段代码执行 else 块。如果它使用 unsigned int 执行,它会执行 if 块。 使用%x 打印这些值会导致

  1. c=ffffffe9
  2. i=17

我的问题是 unsigned ints 和 char 变量如何存储在内存中?

【问题讨论】:

  • 此处所述的三种方式之一:port70.net/~nsz/c/c11/n1570.html#6.2.6.2
  • 除了变量如何存储在内存中之外,如何将它们转换为表达式也很重要。
  • 请记住,这可能会因编译器或编译器设置而有所不同。 char 具有实现定义的签名;它可以签名或未签名。如果已签名,则从那时起定义行为; i &lt; c 绝对是错误的。如果它是无符号的,那么我相信c 将正式具有未定义的值(尽管在大多数二进制补码系统上,它可能具有值256 - 23),使i &lt; c 为真(两种类型都将提升为unsigned int转换)。关键是,不能保证否定字符甚至存在。
  • @ShadowRanger unsigned char c = -23; 定义明确。这里使用的签名编码是不敬的。
  • "否定字符是如何存储在内存中的?" --> 很好奇,为什么编码很重要?它的 value 和任何 signed integer 类型一样是 -23。应该够了。

标签: c


【解决方案1】:

当您比较两种不同的类型时,您的编译器会强制转换为最合适的类型。但在你的情况下,没有好的解决方案:要么放松标志,要么放松精度。

发生的情况是您的编译器正在将您的 char 提升为 unsigned byte

您应该先检查您的 char 是否为负,然后再将其与 unsigned 进行比较,以防止这种情况发生。

回答您的实际问题,否定字符使用其two's complement 存储在内存中。

【讨论】:

    【解决方案2】:

    这应该可以帮助您更好地理解它:Signed to unsigned conversion in C - is it always safe?

    “int 数据类型是有符号的,最小范围至少为 -32767 到 32767(含)。实际值在 limits.h 中分别给出为 INT_MIN 和 INT_MAX。

    无符号整数的最小范围为 0 到 65535(含),实际最大值是同一头文件中的 UINT_MAX。"

    享受吧! :)

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 2012-08-09
      • 1970-01-01
      • 2022-06-15
      • 2019-02-19
      • 1970-01-01
      相关资源
      最近更新 更多