unsigned int 和 int 的问题

C语言 码拜 9年前 (2016-04-05) 977次浏览
#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呢 这个数是怎么得出来的呢

解决方案

20

unsigned int比int”大”
所以ui – 1中的1会转换成unsigned int进行运算,ui-1的结果也是unsigned int永远不会比0小
值 -1 赋值给unsigned int 类型的时候 存储形式为 1111,1111,1111,1111

5

引用:
#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语句不执行。

5

这涉及到C语言的隐式类型转换哦,本人记得C陷阱与缺陷里有讲
ui-1并不是把ui提升到int再去减一,而是把1提升到unsigned int
这样一来结果就是最大的整数了

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明unsigned int 和 int 的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)