c语言的一个问题,请教高手。
intf=0xcffffff3;printf("%x\n",f>>2);printf("%x\n",0xcffffff3>>2);为什么打印结果不一样?...
int f = 0xcffffff3;
printf("%x\n",f>>2);
printf("%x\n",0xcffffff3>>2);
为什么打印结果不一样? 展开
printf("%x\n",f>>2);
printf("%x\n",0xcffffff3>>2);
为什么打印结果不一样? 展开
4个回答
展开全部
printf("%x\n",0xcffffff3>>2);中的0xcffffff3没有赋给变量,编译器把它按其大小解释为无称号数;而int f = 0xcffffff3;中的f是int型,0xcffffff3由于最高位是1,就按负数取补存放了。无论正数负数,右移位时符号位是跟随的,所以造成结果不同。
追问
直接写printf("%d\n",10);这里的10默认是无符号的么?
如果是int a = 10; 前面不加signed或unsigned 默认是那个?
追答
都不知道你在问什么,你都定义了int a = 10,还需要谁去默认呢?printf("%d\n",10);中10是有符号的,要按%d来处理;你举的这个例子不能说明问题,问题中是有操作的(>>),而这里没有;没有声明的整数在操作时是按无符号对待的,而输出时是按控制符来转换的,就是说,如果是printf("%d\n",10+1);,那么10+1时10是无符号的,而把结果11输出时是有符号的。而且这可能还与编译器有关,但我没有试过,只是推测。严格说来“无符号”可能也欠妥,应该是按正数对待,尽管它超出了正数范围;只有前面加"-"号了才作负数解。个人管见,只供参考……
展开全部
根据编译器的不同,int类型数据所占据的空间是不同的,有的是2个字节,有的是4个字节。如果是2个字节的,你所表达的数据就超过了范围,所以显示的结果就不一定一样了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int f = 0xcffffff3;
转化为整形的超过了int的范围,所以变成负数,然后移动就出问题了
转化为整形的超过了int的范围,所以变成负数,然后移动就出问题了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
f>>2 进行的是带符号右移最高位补符号位,这里是1,最后得到值为f3fffffc
0xcffffff3>>2 进行的是不带符号右移最高位补0 最后得到值为33ffffc
0xcffffff3>>2 进行的是不带符号右移最高位补0 最后得到值为33ffffc
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询