【问题标题】:Depiction of binary digit changes during promotion from signed to unsigned integers/what happens?从有符号整数到无符号整数提升期间二进制数字变化的描述/会发生什么?
【发布时间】:2018-02-03 18:56:26
【问题描述】:

y 提升为 unsigned int 并在此处与 x 进行比较。二进制数比较是否每次都发生?那么如果(12 == -4)完成了,为什么不能将LHS提升为无符号并打印“相同”?(考虑到12 = 1100,-4 = 1100)如果我错了,请纠正。

#include<stdio.h>
int main() 
{
    unsigned int x = -1;
    int y = ~0;
    if(x == y)//1.what happens if( y == x) is given?.O/P is "same" then also.
        printf("same");//output is "same"
    else
        printf("not same");
    printf("%d",x);//2.output is -1.Won't x lose it's sign when unsigned is given?My hunch is x should become +1 here. 
    getchar();
    return 0;
}

请同时提供上述代码的二进制数以及代码cmets中1.和2.的答案。谢谢。

【问题讨论】:

  • 您的问题中的why can't it promote LHS to 4 and print "same" 部分非常不清楚IMO。
  • 顺便说一句,-4 == 1100 仅适用于 4 位系统。
  • printf("%d",x); 是未定义的行为,因为x 不是int
  • 请在代码 cmets 中提供我的家庭作业的答案在这里对你来说不会很好。
  • %d,你告诉printf()它是签名的。所以printf()相信你。

标签: c operators bitwise-operators unsigned-integer


【解决方案1】:

首先在您的系统中检查unsigned int 的大小。

在我的机器上:printf("%zu\n",sizeof(unsigned int));//4 byte

因为我们有 4 个字节来存储 Uint 数据类型,所以我们可以说

unsigned int x ;//

x:Range[0, Max_number_with_4byte]

Max_number_with_4byte: (2^32) - 1 = 0xFFFFFFFF

由于无符号,显然 x 只能包含正数。

但是你给x = -1;,假设一个循环行为,当我们从0后退一步时,x到达最后一点:Max_number_with_4byte。

并将 x 打印到屏幕显示:0xFFFFFFFF

printf("%x\n",(unsigned int )x);查看x的十六进制等价物 和printf("%y\n",(unsigned int )y); 来查看 x,y 的相等性。

考虑y = ~0;,如果在 y 中使用 ~ 运算符,则我们有 32 位 y 所有位都更改为 1,以十六进制形式我们看到 FFFFFFFF。 (我们不能用 printf 打印二进制数并使用相等的十六进制表示)

你可以看到这个online calculator如何将-1转换成0xFFFFFFFF

回答你的问题

y 未提升为无符号整数。它只是改变了它的位形式0 -&gt; 1

是否每次都会进行二进制数比较?

在每个条件下都可以,例如在if(10 &gt; 20) 首先将 10 和 20 都转换为其对应的二进制数,然后进行比较。

if (12 == -4)看我上面的解释。

-4 不等于计算机内部的1100(您的变量)。

-4 = 0xFFFFFFFCsee

【讨论】:

    【解决方案2】:

    unsigned int =-1 实际上应该解释为最大 unsigned int(4294967295);肯定不会变成1。

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      相关资源
      最近更新 更多