unsigned int 和 int 的问题

Hamber_Bao 2016-06-29 03:00:42

#include <stdio.h>

int main(void)
{
unsigned ui = 0;
int a = 0;

if(0 > (ui - 1))
a = 1;

printf("%d\n",a);
printf("%u\n",ui-1);
}


输出结果为
0
4294967295


我想问下,为什么a的值没有改变呢?ui 的值为0,0-1等于-1,是小于0的,得执行a=1,输出a 的值应该为1

第二个问题 ui-1的值为什么会是4294967295呢 这个数是怎么得出来的呢
...全文
206 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
醉花阴柳 2016-06-30
  • 打赏
  • 举报
回复
这涉及到C语言的隐式类型转换哦,我记得C陷阱与缺陷里有讲 ui-1并不是把ui提升到int再去减一,而是把1提升到unsigned int 这样一来结果就是最大的整数了
ForestDB 2016-06-29
  • 打赏
  • 举报
回复
引用 楼主 Hamber_Bao 的回复:

#include <stdio.h>

int main(void)
{
     unsigned ui = 0;
     int a = 0;

     if(0 > (ui - 1))
              a = 1;

     printf("%d\n",a);
     printf("%u\n",ui-1);
}
输出结果为 0 4294967295 我想问下,为什么a的值没有改变呢?ui 的值为0,0-1等于-1,是小于0的,得执行a=1,输出a 的值应该为1 第二个问题 ui-1的值为什么会是4294967295呢 这个数是怎么得出来的呢
if(0 > (ui - 1)) 如果表达式中同时有int和unsigned,那么在演算表达式时,所有的int会“提升”成unsigned,然后再演算, 那么上述if其实就是: if (0U > (0U - 1U)) 那么0U - 1U为多少呢?就是4294967295U,这里发生了下溢。 0U > 4294967295U吗?显然false,所以if语句不执行。
小灸舞 版主 2016-06-29
  • 打赏
  • 举报
回复
unsigned int比int"大"
所以ui - 1中的1会转换成unsigned int进行运算,ui-1的结果也是unsigned int永远不会比0小
值 -1 赋值给unsigned int 类型的时候 存储形式为 1111,1111,1111,1111
  • 打赏
  • 举报
回复
if(0 > int(ui - 1))

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧