gcc不能区分正数和负数 (z)
  Home FAQ Contact Sign in
cn.comp.lang.vc only
 
Advanced search
POPULAR GROUPS

more...

cn.comp.lang.vc Profile…
 Up
gcc不能区分正数和负数 (z)         


Author: Moses
Date: Nov 19, 2007 02:31

很有趣的发现, 呵呵,
转自 Solidot http://linux.solidot.org/article.pl?sid=07/11/19/0512218&from=rss :

linux程序不能区分正数和负数,例如,-10和10会被认为是相等的。真的是这样吗?试试以下的C代码:
int main () {
int i=2;
if( -10*abs (i-1) == 10*abs(i-1) )
printf ("OMG,-10==10 in linux!\n");
else
printf ("nothing special here\n");
}
同样的C代码,在windows和unix系统中编译运行的结果是nothing special here,只有linux得到是-10==10。
恩,我们的gcc在这里犯了一个低级错误。
8 Comments
Re: gcc不能区分正数和负数 (z)         


Author: Buzzard
Date: Nov 19, 2007 19:58

呵呵无聊比较了下,很有意思。不过用编译器生成汇编还必须选择不要优化,否则
连O1的优化都成了简单的一个输出语句而已了。
gcc生产代码这样:
movl $2, -4(%%ebp)
movl -4(%%ebp), %%edx
movl %%edx, %%eax
sall $2, %%eax
addl %%edx, %%eax
addl %%eax, %%eax
negl %%eax
;;这个很好理解,换成计算式[(a*4)+a] + [(a*4)+a],最后结果取反
addl $10, %%eax ;;注意这里eax == -20,计算后结果是-10
movl %%eax, -12(%%ebp) ;;
cmpl $0, -12(%%ebp)
jns L11
negl -12(%%ebp)
L11:
movl -4(%%ebp), %%edx
movl %%edx, %%eax
sall $2, %%eax ...
Show full article (4.99Kb)
no comments
Re: gcc不能区分正数和负数 (z)         


Author: Davy Hawk
Date: Nov 19, 2007 20:03

Moses wrote:
> 很有趣的发现, 呵呵,
> 转自 Solidot http://linux.solidot.org/article.pl?sid=07/11/19/0512218&from=rss :
>
>
> linux程序不能区分正数和负数,例如,-10和10会被认为是相等的。真的是这样吗?试试以下的C代码:
> int main () {
> int i=2;
> if( -10*abs (i-1) == 10*abs(i-1) )
> printf ("OMG,-10==10 in linux!\n");
> else
> printf ("nothing special here\n");
> }
> 同样的C代码,在windows和unix系统中编译运行的结果是nothing special here,只有linux得到是-10==10。
> 恩,我们的gcc在这里犯了一个低级错误。

主要出在对 abs() 的优化上面~~
no comments
Re: gcc不能区分正数和负数 (z)         


Author: Moses
Date: Nov 19, 2007 21:31

唉...在你的注释下竟然看懂了, 看来有注释和没注释差别很大啊.............. o_o

--
楼上 Buzzard 说的 "Re: gcc不能区分正数和负数 (z)" 在某一分钟的第 12 秒被 Moses 所回复;
文件夹 ID 为 41;
原帖 100 行共 5364 字节.
B> 呵呵无聊比较了下,很有意思。不过用编译器生成汇编还必须选择不要优化,否则
B> 连O1的优化都成了简单的一个输出语句而已了。
B> gcc生产代码这样:
B> movl $2, -4(%%ebp)
B> movl -4(%%ebp), %%edx
B> movl %%edx, %%eax
B> sall $2, %%eax
B> addl %%edx, %%eax
...
Show full article (5.61Kb)
no comments
Re: gcc不能区分正数和负数 (z)         


Author: Moses
Date: Nov 19, 2007 21:31

呵呵, 应该就是了~~~

--
楼上 Davy 说的 "Re: gcc不能区分正数和负数 (z)" 在某一分钟的第 38 秒被 Moses 所回复;
文件夹 ID 为 41;
原帖 17 行共 1506 字节.
DH> Moses wrote:
>> 很有趣的发现, 呵呵,
>> 转自 Solidot http://linux.solidot.org/article.pl?sid=07/11/19/0512218&from=rss :
>>
>> linux程序不能区分正数和负数,例如,-10和10会被认为是相等的。真的是这样吗?试试以下的C代码:
>> int main () {
>> int i=2;
>> if( -10*abs (i-1) == 10*abs(i-1) )
>> printf ("OMG,-10==10 in linux!\n");
>> else
>> printf ("nothing special here\n");
>> }
>> 同样的C代码,在windows和unix系统中编译运行的结果是nothing special here,只有linux得到是-10==10。
>> 恩,我们的gcc在这里犯了一个低级错误。
Show full article (1.00Kb)
no comments
Re: gcc不能区分正数和负数 (z)         


Author: Buzzard
Date: Nov 19, 2007 23:20

^_^呵呵看懂了就知道真正的问题出在哪里了

On Tue, 20 Nov 2007 13:31:29 +0800, "Moses" gmail.com> wrote:
--
>唉...在你的注释下竟然看懂了, 看来有注释和没注释差别很大啊.............. o_o
>
>
>
>--
>楼上 Buzzard 说的 "Re: gcc不能区分正数和负数 (z)" 在某一分钟的第 12 秒被 Moses 所回复;
>文件夹 ID 为 41;
>原帖 100 行共 5364 字节.
>
>> 呵呵无聊比较了下,很有意思。不过用编译器生成汇编还必须选择不要优化,否则
>> 连O1的优化都成了简单的一个输出语句而已了。
>> gcc生产代码这样:
>> movl $2, -4(%%ebp)
no comments
Re: gcc不能区分正数和负数 (z)         


Author: Moses
Date: Nov 20, 2007 00:04

^__^ 谢谢..

--
楼上 Buzzard 说的 "Re: gcc不能区分正数和负数 (z)" 在某一分钟的第 17 秒被 Moses 所回复;
文件夹 ID 为 41;
原帖 19 行共 1357 字节.
B> ^_^呵呵看懂了就知道真正的问题出在哪里了
B> On Tue, 20 Nov 2007 13:31:29 +0800, "Moses" gmail.com> wrote:
B> --
>> 唉...在你的注释下竟然看懂了, 看来有注释和没注释差别很大啊.............. o_o
>>
>> --
>> 楼上 Buzzard 说的 "Re: gcc不能区分正数和负数 (z)" 在某一分钟的第 12 秒被 Moses 所回复;
>> 文件夹 ID 为 41;
>> 原帖 100 行共 5364 字节.
>>
B>>> 呵呵无聊比较了下,很有意思。不过用编译器生成汇编还必须选择不要优化,否则
B>>> 连O1的优化都成了简单的一个输出语句而已了。
B>>> gcc生产代码这样:
B>>> movl $2, -4(%%ebp)
no comments
Re: gcc不能区分正数和负数 (z)         


Date: Nov 20, 2007 17:45

"Moses" gmail.com> writes:
> 很有趣的发现, 呵呵,
> 转自 Solidot http://linux.solidot.org/article.pl?sid=07/11/19/0512218&from=rss :
>

Freebsd 6.2 下用gcc 3.4/4.2测试,也是出错

no comments
Re: gcc不能区分正数和负数 (z)         


Date: Nov 20, 2007 18:12

"Moses" gmail.com> writes:
> 很有趣的发现, 呵呵,
> 转自 Solidot http://linux.solidot.org/article.pl?sid=07/11/19/0512218&from=rss :
>

这样编译就可以了
gcc42 -o test1 test1.c -ggdb -fno-builtin

no comments