如果对负数取余数
- unsigned int x=43;
- int x1=43;
- printf("%d\n",x%(-3));
- 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) |