关于-12345补码的问题.高手进来指教下.

来源:百度知道 编辑:UC知道 时间:2024/06/22 01:56:46
因为-12345是负数,要转换才能用unsigned int来存放,-12345的补码是1100111111000111对应unsigned int中是53191的二进制代码存入unsigned int形式内存中.那下次提取1100111111000111的怎么知道是提取的是53191还是-12345啊?

也就是说1100111111000111在unsigned int中既代表-12345又代表53191,实际中怎么避免的这个混淆?

你既然定义了unsigned int 那就代表正数即53191

unsigned int表示范围0-65535
int表示范围-32768-32767
当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") : puts(" <= 6");
}
这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是 ">6"。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式 计算出的结果大于6。