Chinaunix首页 | 论坛 | 博客
  • 博客访问: 432224
  • 博文数量: 103
  • 博客积分: 1455
  • 博客等级: 上尉
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-15 22:17
文章分类

全部博文(103)

文章存档

2013年(4)

2012年(99)

我的朋友

分类: C/C++

2012-10-18 21:22:49

如果对负数取余数

点击(此处)折叠或打开

  1. unsigned int x=43;
  2. int x1=43;
  3. printf("%d\n",x%(-3));
  4. printf("%d\n",x1%(-3));

这个程序很有意思,打印出来的是
43
1
不知道是为什么呢?
 
在expert c programming中有这样的描述:
如果其中一个操作数的类型是unsigned long int那么另一个操作数也被转化为unsigned long int其次,如果其中一个操作数的类型是long int而另一个操作数的类型是unsigned int,如果long int能够完整表示unsigned int的所有值(long是32位而int是16位),那么unsigned int类型被转化为long int,如果long int不能完整表示unsigned int的所有值,(long和int都是32位,这样unsigned表示的范围就大于long int)那么两个操作数就被转化为unsigned long int
所以以上程序中的x%(-3)中的-3就会被转化为unsigned int,那么结果就不一样了,我们来试一试
(unsigned int)(-3)得到的结果
 
如果使用printf("%d %d\n",x,(unsigned int)x);
打印出来还是
-3 -3
改成printf("%d %u\n",x,(unsigned int)x);
就变成
-3 4294967693
如果是43%(-3)相当于43%4294967693,得到的结果就是43吧
那么上面的结果就容易解释了
 
阅读(4758) | 评论(0) | 转发(0) |
0

上一篇:volatile在c中的用法

下一篇:新计划

给主人留下些什么吧!~~