c语言的一个问题,请教高手。

int f = 0xcffffff3;
printf("%x\n",f>>2);
printf("%x\n",0xcffffff3>>2);
为什么打印结果不一样?

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输出时是有符号的。而且这可能还与编译器有关,但我没有试过,只是推测。严格说来“无符号”可能也欠妥,应该是按正数对待,尽管它超出了正数范围;只有前面加"-"号了才作负数解。个人管见,只供参考……

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-01
根据编译器的不同,int类型数据所占据的空间是不同的,有的是2个字节,有的是4个字节。如果是2个字节的,你所表达的数据就超过了范围,所以显示的结果就不一定一样了。
第2个回答  2013-05-01
int f = 0xcffffff3;
转化为整形的超过了int的范围,所以变成负数,然后移动就出问题了
第3个回答  2013-05-01
f>>2 进行的是带符号右移最高位补符号位,这里是1,最后得到值为f3fffffc

0xcffffff3>>2 进行的是不带符号右移最高位补0 最后得到值为33ffffc

一个c语言的问题:怎样比较字符串的大小。。。请教高手啊。。。
strcmp 语法:include <string.h> int strcmp( const char *str1, const char *str2 );功能:比较字符串str1 and str2, 返回值如下:返回值 解释 less than 0 str1 is less than str2 equal to 0 str1 is equal to str2 greater than 0 str1 is greater than str2 例如:printf( "Ente...

在下是C语言初学者,想请教高手一个问题?(有关对奇数方魔阵如何用动态...
x=n-1;y=n\/2;array[x*n+y]=1;flag[x*n+y]=1;for(i=2;i<=j;i++){ if(x==y&&x>=n-1){ x--;} elseif(x>=n-1){ x=0;y++;}elseif(y>=n-1){ y=0;x++;}elseif(flag[(x+1)*n+y+1]==1){ x--;}else{ x++;y++;} array[x*n+y]=i;flag[x*n+y...

请教C语言高手为小弟解答的疑惑
1,int* pN=&N;pN是一个指针,这个指针指向N,指针的值是存放数据N的内存的首地址;2,int* pN=N;pN也是一个指针,指针的值是就是N;这种用法是不合适的,因为你一般不知道这个指针指向的内存内容是什么。如果真要用的话,可以写成这样:int* pN=(int*)N。3,int* pIndex=nArray;这种写法...

请教C语言高手一个问题
函数调用fun(s), 是传递char* 过去, 传递的是数组的指针. 指向数组的首地址, 具体值和&s[0]是一样的. 2者还是有区别的, s 在函数传递时表示的是指向数组的指针, 而&s[0]表示的是数组第0个元素的地址, 含义不一致,但是具体值是一致的....

请教高手 C语言问题 编程实现求两个数的最大公约数,要有流程图
这个问题能用辗转相除法来解决。具体来说,就是18和27 27 = 18 1 + 9;18 = 9 2;这个时候没余数了,9就是最大公约数。写成代码的形式就是下面的了 include<stdio.h> int main(){ int a,b,t;scanf("%d%d",&a,&b);t = a + b;a = a > b ?a :b;b = t - a;\/\/把最大...

请教:c语言的问题请教各位高手,是一个欧拉公式的转换问题,函数中两个返...
F-E+V=2。试一下用拓朴学方法证明关于多面体的面、棱、顶点数的欧拉公式。证明 :(1)把多面体(图中①)看成表面是薄橡皮的中空立体。(2)去掉多面体的一个面,就可以完全拉开铺在平面上而得到一个平面中的直线形,像图中②的样子。假设F′,E′和V′分别表示这个平面图形的(简单)多边形、...

请教一个c语言底层问题,高手回答,关系很大,谢谢
对数值型数据,如果不带小数点,机器默认为int类型 所以,不论是char a=16,还是int b=16; a=b; 都会存在你所说的截断问题 对于一个常量,系统在运行时,会分配一个只读空间来保存。所以,16这个常量在运行时,就会先给它安个家的(在只读内存区给它分配一个存储位置)。

请教C语言高手,很多题目不会做。。
4,选d stringlen计算的是“\\0”前的字符长度,sizeof计算的是整个数组长度 5,选c printf("%s\\n",strp[3]+2);表示从整个数组中strp[3](即第四个元素)的第2个子元素开始连续输出以后所有strp[3】的子元素,若改为printf("%s\\n",strp[3]+5);则输出空格,因为“ddddd”一共5个元素 10...

C语言问题 如何填空实现三次方 请教高手
它这个循环式循环两次,所以填z就好了,也就是执行两边z*z

请教C语言高手:char c ; c=‘a’; c的ASCII代码为97,则在内存中c的值...
为保证人类和设备,设备和计算机之间能进行正确的信息交换,人们编制的统一的信息交换代码,这就是ascii码表,它的全称是“美国信息交换标准代码”。我们再来看看:char c ;c='c';,此时给字符变量赋值的是字符:即‘c’,此时系统“一看”是字符,就用ascll码的形式存储。还有就是:计算是按二进制的...

相似回答