百韵网 >>  正文

一个经常被忽略的c语言问题

来源:www.baiyundou.net   日期:较早时间
编译器是不会加65536的,其实内存存储的都是一样的,
-20就是FFEC,也就是1111 1111 1110 1100,这样有符号就是-20,无符号就是65516。
编译器会尽可能用一个合适的类型去存放a+b,
所以你没有把a+b的值赋值给一个特定类型的变量时,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
它的结果就是无符号的,所以会大于6,如果你写成
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int temp = a+b;
(temp>6)?puts(">6"):puts("<=6");
则应该会输出<=6

所以你改成unsigned a = 6; int b = -12;也没用

变量b本来是unsigned型变量,它是个非负数,你偏偏把-20赋给了它,当然会出错。
把负数赋给一个unsigned型变量将会发生溢出。
unsigned型变量的取值范围为0~65536,如果赋给它的值不在这个范围内,则会把这个值加上或减去N个65536,使得这个值还是在0~65536的范围内,这就是溢出!
你把-20赋给unsigned型变量b,它会加上65536把这个数调整到0~65536的范围内,所以b的值是-20 + 65536 = 65516

因此,a + b 当然大于 6 了!!

4: int a=6;
00401028 mov dword ptr [ebp-4],6
5:
6: unsigned int b=-20;
0040102F mov dword ptr [ebp-8],0FFFFFFECh
7:
8: (a+b>6)?puts(">6"):puts("<=6");
00401036 mov eax,dword ptr [ebp-4]
00401039 add eax,dword ptr [ebp-8]
0040103C cmp eax,6

这是程序在vc下反汇编的片段,c语言混合运算遵循自动类型转换由低数据类型向高数据类型转换,即char,short->int->unsigned->long->double<-float
-20=0FFFFFFECh在无符号变量范围内,所以b接收-20时-20自动转换成无符号数值即0FFFFFFECh
a+b=0FFFFFFECh+6=0fffffff2h>6,期间运算无溢出

可能是结果因为是负值,而加了一个65535,所以得不到接过了吧

同意DannyPotter。

请高手帮忙看一个C语言问题, 是关于忽略修饰符 * 的。~

%d%*d%d,意思是将第二个数值不存入变量,相当于跳过去这个数值。
如果输入是数值型,那么中间用空格起到分隔符作用,跟回车效果一样。但是如果是输入是字符型,例如%c,这是空格按一个字符计算,所以不可以用空格当分隔符使用。
%2d%*2d%2d,具有宽度约束的,每2个数字赋值给变量,碰到*2时,跳过2个数字,然后继续2个数字给变量。

strcmp 改为 stricmp 就是忽略大小写;

相关要点总结:

18616457957:关于c语言的一个小问题,小弟刚学c语言,希望大家帮忙解决
贺泳答:第一main 你写的mian 第二你的变量中不存在sball变量 应该为shall,这个图是我的运行结果,出现乱码那就需要你的编辑器支持汉字。

18616457957:编写的C语言程序是对的,确为什么总是显示有一个错误,而且看不到错误原因...
贺泳答:你可以到相应的路径下找到这个应用程序。因此问题可以按照以下方法解决:打开vc界面 点击VC“TOOLS(工具)”—>“Option(选择)”—>“Directories(目录)”重新设置“Excutable Fils、Include Files、Library Files、Source Files”的路径。很多情况可能就一个盘符的不同 (例如你的VC装在C,但是这些路径...

18616457957:一个很奇怪的C语言问题
贺泳答:出错的位置与什么时候堆区用完为止,所以 未必固定。如果不是上述这个问题,那么,说说... 我,我也遇到过莫名的错误,添了printf就可以越过。不妨可以尝试:把某些 反复频繁 用 的变量,包括指针,改成全局量,(把声明部分提到 main() 以前),也许就解决问题了。(我猜想,可能是编译器 编译优化 ...

18616457957:求助一个c语言问题?
贺泳答:故*argv是一个字符串,也是argv[0]++argv会使它指向下一个字符串 argv[]={"FILEL","CHINA","BEIJING","SHANGHAI"};//题目中argv的初始值可以看成是 e.g.所以排除单个字符的选项C D 然后看选项A B 问题焦点在"CHINA" 就是 argv[1],或者说第一次++argv后的*argv是否会被输出(显然这是...

18616457957:一个很简单的C语言程序,总是在编译时有一个错误,拜托各位高手给我看看到...
贺泳答:对啊。在什么环境编的,如果用VC和TC明显没错的,我用VC6.0也试过了没错啊。如果用别的软件想DEVc++就得改了,devc++里main函数必须返回int行,那样最后一样加个return 0就可以了。

18616457957:请问关于C语言的一个小问题
贺泳答:for 的使用方法 for( ; ; ) 两个分号 分成3部分 第一部分 是 初始值 第二部分是判断 第三部分 是步长 还有 int main 不是 int mian ~for(i=1,i<=10,i++); 这个有错误 还有 for ()后面不要直接接分号 ; 不然你的循环就作废了 把for ()后面的分号都去掉 ...

18616457957:紧急求助,一个C语言的问题
贺泳答:在16位编译环境中输出结果是:u=fffb,u=65531,ch=a,k=97 在32位编译环境中输出结果则会是 u=fffffffb,u=4294967291,ch=a,k=97 同一个值,作为带符号数和无符号数,输出会不同;不同类型的变量,由于其有效的位长不同(例如char型是8位,比int或unsigned int的有效位数少),产生类型转换...

18616457957:初学c语言的一个搞不清楚的问题
贺泳答:num不应该累加.前面一个字符是否空格可以从WORD的值看出来,若WORD的值等于0,则表示前一个字符是空格;如果word等于1,则意味着前一个字符为非空格.你可以结合一个具体的例子来看一下就好理解了,例如: 输入的字符串为:"I am a boy."注意是从头一个字符一个字符处理的语句:for(i=0;(c=string[i]...

18616457957:一个C语言的基础问题
贺泳答:解答:1、 c语言是以分号做为语句的结束。for循环是一个语句所以就必须得有分号,不然编译无法通过,出现语法错误。for语句是循环条件和循环体的组合。你这里给出了循环条件,但是没有循环体。循环体为空。然后以分号表示这个for语句的结束。如果你的循环体有多个语句可以用{}来括起来。2、i++,存在...

18616457957:问一个C语言的问题
贺泳答:在c语言里是可以改成.c的,但是采用,一个头文件一个定义文件比较好。意思就是:多余部分,忽视覆盖过程.大哥,你这么折腾,我们都要废了。不能超过20的原因可能是你的FIFO转存器的大小就这么大。超过就溢出了呗 FIFO就是转存器,其实就是存储器,用来缓冲数据的。如果不是溢出问题,那就真不可能...

(编辑:本站网友)
相关推荐
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图
@ 百韵网