【问题标题】:Unsigned char 1's complement in CC中的无符号字符1的补码
【发布时间】:2018-04-16 22:23:21
【问题描述】:

假设我有以下代码:

unsigned char c = 0;
printf("%u\n", ~c);

GCC 打印值4294967295,意味着它打印了ULONG_MAX 的值。

C11 6.3.1.3 有符号和无符号整数:

  1. 当整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新的表示 类型,它是不变的。
  2. 否则,如果新类型是无符号的,则通过反复加或减一的最大值来转换该值 可以用新类型表示,直到值在 新类型.60)
  3. 否则,新类型是有符号的,值不能在其中表示;结果是实现定义的或 引发了实现定义的信号。

因此,c 在应用运算符 ~ 之前被提升为 unsigned int。就这样 结果是0u 的补码。我对吗?还是未定义?

【问题讨论】:

  • 我们是否应该假设您的意思是x 而不是c,反之亦然?仅供参考,这是一个可变参数列表,things are a little different

标签: c bit-manipulation unsigned complement


【解决方案1】:

C 不执行(无符号)char 类型的算术运算。根据整数提升,首先提升所有参数。 unsigned char 提升为 int,所以 ~x 的结果是 -1。然后,您将此值打印为 unsigned int,这会给出您观察到的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多