#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
所以ui – 1中的1会转换成unsigned int进行运算,ui-1的结果也是unsigned int永远不会比0小
值 -1 赋值给unsigned int 类型的时候 存储形式为 1111,1111,1111,1111
5
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
这样一来结果就是最大的整数了
ui-1并不是把ui提升到int再去减一,而是把1提升到unsigned int
这样一来结果就是最大的整数了