无符号数表示负数

unsigned int u;
u = 3; // 1
u = -1; // 2
u = -1u; // 3

printf("%u\n", u); // 4
printf("%d\n", u); // 5

在 1 中,“3”的类型为 int,而左边是一个 unsigned int 类型的变量,所以进行 赋值时隐式转换,相当于:u = (unsigned int) 3,得到结果 3u

在 2 中, -1 的类型是 int,所以和 1 一样,2 式相当于u = (unsigned int) -1,但是 unsigned int 能表示的范围是 0 - UINT_MAX,-1 不在其中,所以根据 unsigned 类型的转换规则(如果是 signed 类型,结果未定义),-1 被调整成为 -1 + n * (UINT_MAX + 1) (这是一个数学表达式,不考虑类型和表示范围的问题),当 n == 1 时,该式的值 在 unsigned int 的表示范围之内,所以 -1 被调整成了 UINT_MAX

在 3 中,1u 的类型是 unsigned int,进行一元操作“-”(取负)后,使用 2 式使用的方法调整为 UINT_MAX,所以 3 式相当于u = UINT_MAX,属于直接赋值,不用进行转换

4 式是输出 unsigned int 的正确方法。因为 unsigned int 是一个等级上等于 int 的类型,所以 u 的值作为参数不进行任何转换传入函数 printf 中,并被正常解析

5 式中的 %d 与 unsigned int 类型不匹配,所以根据标准,行为是未定义的;大多数编译器此时的处理方法是把 unsigned int 按照2进制解析成 int,就好像进行了
int tmp = *(int *) &u
printf("%d\n", tmp)
一样,所以在使用 2的补码 表示有符号数的机器上,结果就是 -1  


另外,需要注意的是当表达式同时存在有符号类型和无符号类型时操作数都自动转换为无符号类型

unsigned int a=20;

signed int b=-130;

a>b?还是b>a?实验证明b>a,也就是说-130>20,为什么会出现这样的结果呢?

这是因为在C语言操作中,如果遇到无符号数与有符号数之间的操作,编译器会自动转化为无符号数来进行处理,因此a=20,b=4294967166,这样比较下去当然b>a了。


另外,还需要注意无符号整数的陷阱

unsigned int a=1, int b=-2;

程序的第一行,变量b和a一样,都是无符号整形,这是一个陷阱。







  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值