Error[8]: Undefined offset: 3, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述正如我们所知的计算整数x / 2,我们只写writey = x / 2;类似于x * 2;但优秀的程序员使用位 *** 作来计算它. 他们只做y = x>> 1; 这两种方法有什么区别吗? 差异,我的意思是所需的时间/空间/内存的差异或两者完全相同(即x> 2由x>>> 1实现)? 也是以相同的方式实现与其他数字的乘法/除法而不是2(即5 * 5 = 10 * 2 5 * 1 = 10 <1 5 = 25 正如我们所知的计算整数x / 2,我们只写writey = x / 2;类似于x * 2;但优秀的程序员使用位 *** 作来计算它.

他们只做y = x>> 1;

这两种方法有什么区别吗?
差异,我的意思是所需的时间/空间/内存的差异或两者完全相同(即x> 2由x>>> 1实现)?

也是以相同的方式实现与其他数字的乘法/除法而不是2(即5 * 5 = 10 * 2 5 * 1 = 10 <1 5 = 25)?

解决方法 这个问题已经在rIDiculousfishblog上得到了回答: http://ridiculousfish.com/blog/posts/will-it-optimize.html

division by 2 to right shift

Will GCC transform an integer division by 2 to a right shift?

@H_301_31@
int halve_it(int x) {   return x / 2;}int halve_it(int x) {   return x >> 1;}

The right shift operator is equivalent to division that rounds towards
negative infinity,but normal division rounds towards zero. Thus the
proposed optimization will produce the wrong result for odd negative
numbers.

The result can be “fixed up” by adding the most significant bit to the
numerator before shifting,and gcc does this.

@H_301_31@

优秀的程序员让编译器优化他们的代码,除非他们遇到性能损失.

编辑:既然你要求官方消息来源,让我们引用C99的标准理由文件.你在这里找到它:http://www.open-std.org/jtc1/sc22/wg14/www/docs/C99RationaleV5.10.pdf

In C89,division of integers involving negative operands Could round upward or downward in an implementation-defined manner; the intent was to avoID incurring overhead in run-time code to check for special cases and enforce specific behavior. In Fortran,however,the result will always truncate toward zero,and the overhead seems to be acceptable to the numeric programming community. Therefore,C99 Now requires similar behavior,which should facilitate porting of code from Fortran to C. The table in §7.20.6.2 of this document illustrates the required semantics.

@H_301_31@

你的优化在C89中是正确的,因为它让编译器按照自己的意愿去做.但是,C99引入了一个符合Fortran代码的新约定.以下是除法运算符的预期示例(始终来自同一文档):

不幸的是,您的优化不符合C99标准,因为它没有给出x = -1的正确结果:

#include <stdio.h>int div8(int x){    return x/3;}int rs8( int x ){    return x >> 3;}int main(int argc,char *argv[]){    volatile int x = -1;    printf("div : %d \n",div8(x) );    printf("rs : %d \n",rs8(x) );    return 0;}Result:div : 0 rs : -1 [Finished in 0.2s]

如果查看已编译的代码,可以发现一个有趣的区别(使用g v4.6.2编译):

0040138c <__Z4div8i>:  40138c:   55                      push   %ebp  40138d:   89 e5                   mov    %esp,%ebp  40138f:   8b 45 08                mov    0x8(%ebp),%eax  401392:   85 c0                   test   %eax,%eax  401394:   79 03                   jns    401399 <__Z4div8i+0xd>  401396:   83 c0 0f                add    [+++]x7,%eax  401399:   c1 f8 04                sar    [+++]x3,%eax  40139c:   5d                      pop    %ebp  40139d:   c3                      ret    0040139e <__Z3rs8i>:  40139e:   55                      push   %ebp  40139f:   89 e5                   mov    %esp,%ebp  4013a1:   8b 45 08                mov    0x8(%ebp),%eax  4013a4:   c1 f8 03                sar    [+++]x3,%eax  4013a7:   5d                      pop    %ebp  4013a8:   c3                      ret

在第401392行,有一个测试指令,它将检查奇偶校验位,如果数字为负,则将加1 <<<右移3个单位之前(n-1)= 7到x.

总结

以上是内存溢出为你收集整理的c – x / 2和x >> 1或x * 2和x << 1的差值,其中x是整数全部内容,希望文章能够帮你解决c – x / 2和x >> 1或x * 2和x << 1的差值,其中x是整数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 4, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述正如我们所知的计算整数x / 2,我们只写writey = x / 2;类似于x * 2;但优秀的程序员使用位 *** 作来计算它. 他们只做y = x>> 1; 这两种方法有什么区别吗? 差异,我的意思是所需的时间/空间/内存的差异或两者完全相同(即x> 2由x>>> 1实现)? 也是以相同的方式实现与其他数字的乘法/除法而不是2(即5 * 5 = 10 * 2 5 * 1 = 10 <1 5 = 25 正如我们所知的计算整数x / 2,我们只写writey = x / 2;类似于x * 2;但优秀的程序员使用位 *** 作来计算它.

他们只做y = x>> 1;

这两种方法有什么区别吗?
差异,我的意思是所需的时间/空间/内存的差异或两者完全相同(即x> 2由x>>> 1实现)?

也是以相同的方式实现与其他数字的乘法/除法而不是2(即5 * 5 = 10 * 2 5 * 1 = 10 <1 5 = 25)?

解决方法 这个问题已经在rIDiculousfishblog上得到了回答: http://ridiculousfish.com/blog/posts/will-it-optimize.html

division by 2 to right shift

Will GCC transform an integer division by 2 to a right shift?

@H_301_31@
int halve_it(int x) {   return x / 2;}int halve_it(int x) {   return x >> 1;}

The right shift operator is equivalent to division that rounds towards
negative infinity,but normal division rounds towards zero. Thus the
proposed optimization will produce the wrong result for odd negative
numbers.

The result can be “fixed up” by adding the most significant bit to the
numerator before shifting,and gcc does this.

@H_301_31@

优秀的程序员让编译器优化他们的代码,除非他们遇到性能损失.

编辑:既然你要求官方消息来源,让我们引用C99的标准理由文件.你在这里找到它:http://www.open-std.org/jtc1/sc22/wg14/www/docs/C99RationaleV5.10.pdf

In C89,division of integers involving negative operands Could round upward or downward in an implementation-defined manner; the intent was to avoID incurring overhead in run-time code to check for special cases and enforce specific behavior. In Fortran,however,the result will always truncate toward zero,and the overhead seems to be acceptable to the numeric programming community. Therefore,C99 Now requires similar behavior,which should facilitate porting of code from Fortran to C. The table in §7.20.6.2 of this document illustrates the required semantics.

@H_301_31@

你的优化在C89中是正确的,因为它让编译器按照自己的意愿去做.但是,C99引入了一个符合Fortran代码的新约定.以下是除法运算符的预期示例(始终来自同一文档):

不幸的是,您的优化不符合C99标准,因为它没有给出x = -1的正确结果:

#include <stdio.h>int div8(int x){    return x/3;}int rs8( int x ){    return x >> 3;}int main(int argc,char *argv[]){    volatile int x = -1;    printf("div : %d \n",div8(x) );    printf("rs : %d \n",rs8(x) );    return 0;}Result:div : 0 rs : -1 [Finished in 0.2s]

如果查看已编译的代码,可以发现一个有趣的区别(使用g v4.6.2编译):

0040138c <__Z4div8i>:  40138c:   55                      push   %ebp  40138d:   89 e5                   mov    %esp,%ebp  40138f:   8b 45 08                mov    0x8(%ebp),%eax  401392:   85 c0                   test   %eax,%eax  401394:   79 03                   jns    401399 <__Z4div8i+0xd>  401396:   83 c0 0f                add    x7,%eax  401399:   c1 f8 04                sar    [+++]x3,%eax  40139c:   5d                      pop    %ebp  40139d:   c3                      ret    0040139e <__Z3rs8i>:  40139e:   55                      push   %ebp  40139f:   89 e5                   mov    %esp,%ebp  4013a1:   8b 45 08                mov    0x8(%ebp),%eax  4013a4:   c1 f8 03                sar    [+++]x3,%eax  4013a7:   5d                      pop    %ebp  4013a8:   c3                      ret

在第401392行,有一个测试指令,它将检查奇偶校验位,如果数字为负,则将加1 <<<右移3个单位之前(n-1)= 7到x.

总结

以上是内存溢出为你收集整理的c – x / 2和x >> 1或x * 2和x << 1的差值,其中x是整数全部内容,希望文章能够帮你解决c – x / 2和x >> 1或x * 2和x << 1的差值,其中x是整数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 5, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述正如我们所知的计算整数x / 2,我们只写writey = x / 2;类似于x * 2;但优秀的程序员使用位 *** 作来计算它. 他们只做y = x>> 1; 这两种方法有什么区别吗? 差异,我的意思是所需的时间/空间/内存的差异或两者完全相同(即x> 2由x>>> 1实现)? 也是以相同的方式实现与其他数字的乘法/除法而不是2(即5 * 5 = 10 * 2 5 * 1 = 10 <1 5 = 25 正如我们所知的计算整数x / 2,我们只写writey = x / 2;类似于x * 2;但优秀的程序员使用位 *** 作来计算它.

他们只做y = x>> 1;

这两种方法有什么区别吗?
差异,我的意思是所需的时间/空间/内存的差异或两者完全相同(即x> 2由x>>> 1实现)?

也是以相同的方式实现与其他数字的乘法/除法而不是2(即5 * 5 = 10 * 2 5 * 1 = 10 <1 5 = 25)?

解决方法 这个问题已经在rIDiculousfishblog上得到了回答: http://ridiculousfish.com/blog/posts/will-it-optimize.html

division by 2 to right shift

Will GCC transform an integer division by 2 to a right shift?

@H_301_31@
int halve_it(int x) {   return x / 2;}int halve_it(int x) {   return x >> 1;}

The right shift operator is equivalent to division that rounds towards
negative infinity,but normal division rounds towards zero. Thus the
proposed optimization will produce the wrong result for odd negative
numbers.

The result can be “fixed up” by adding the most significant bit to the
numerator before shifting,and gcc does this.

@H_301_31@

优秀的程序员让编译器优化他们的代码,除非他们遇到性能损失.

编辑:既然你要求官方消息来源,让我们引用C99的标准理由文件.你在这里找到它:http://www.open-std.org/jtc1/sc22/wg14/www/docs/C99RationaleV5.10.pdf

In C89,division of integers involving negative operands Could round upward or downward in an implementation-defined manner; the intent was to avoID incurring overhead in run-time code to check for special cases and enforce specific behavior. In Fortran,however,the result will always truncate toward zero,and the overhead seems to be acceptable to the numeric programming community. Therefore,C99 Now requires similar behavior,which should facilitate porting of code from Fortran to C. The table in §7.20.6.2 of this document illustrates the required semantics.

@H_301_31@

你的优化在C89中是正确的,因为它让编译器按照自己的意愿去做.但是,C99引入了一个符合Fortran代码的新约定.以下是除法运算符的预期示例(始终来自同一文档):

不幸的是,您的优化不符合C99标准,因为它没有给出x = -1的正确结果:

#include <stdio.h>int div8(int x){    return x/3;}int rs8( int x ){    return x >> 3;}int main(int argc,char *argv[]){    volatile int x = -1;    printf("div : %d \n",div8(x) );    printf("rs : %d \n",rs8(x) );    return 0;}Result:div : 0 rs : -1 [Finished in 0.2s]

如果查看已编译的代码,可以发现一个有趣的区别(使用g v4.6.2编译):

0040138c <__Z4div8i>:  40138c:   55                      push   %ebp  40138d:   89 e5                   mov    %esp,%ebp  40138f:   8b 45 08                mov    0x8(%ebp),%eax  401392:   85 c0                   test   %eax,%eax  401394:   79 03                   jns    401399 <__Z4div8i+0xd>  401396:   83 c0 0f                add    x7,%eax  401399:   c1 f8 04                sar    x3,%eax  40139c:   5d                      pop    %ebp  40139d:   c3                      ret    0040139e <__Z3rs8i>:  40139e:   55                      push   %ebp  40139f:   89 e5                   mov    %esp,%ebp  4013a1:   8b 45 08                mov    0x8(%ebp),%eax  4013a4:   c1 f8 03                sar    [+++]x3,%eax  4013a7:   5d                      pop    %ebp  4013a8:   c3                      ret

在第401392行,有一个测试指令,它将检查奇偶校验位,如果数字为负,则将加1 <<<右移3个单位之前(n-1)= 7到x.

总结

以上是内存溢出为你收集整理的c – x / 2和x >> 1或x * 2和x << 1的差值,其中x是整数全部内容,希望文章能够帮你解决c – x / 2和x >> 1或x * 2和x << 1的差值,其中x是整数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
c – x2和x &gt;&gt; 1或x * 2和x &lt;&lt; 1的差值,其中x是整数_C_内存溢出

c – x2和x &gt;&gt; 1或x * 2和x &lt;&lt; 1的差值,其中x是整数

c – x2和x &gt;&gt; 1或x * 2和x &lt;&lt; 1的差值,其中x是整数,第1张

概述正如我们所知的计算整数x / 2,我们只写writey = x / 2;类似于x * 2;但优秀的程序员使用位 *** 作来计算它. 他们只做y = x>> 1; 这两种方法有什么区别吗? 差异,我的意思是所需的时间/空间/内存的差异或两者完全相同(即x> 2由x>>> 1实现)? 也是以相同的方式实现与其他数字的乘法/除法而不是2(即5 * 5 = 10 * 2 5 * 1 = 10 <1 5 = 25 正如我们所知的计算整数x / 2,我们只写writey = x / 2;类似于x * 2;但优秀的程序员使用位 *** 作来计算它.

他们只做y = x>> 1;

这两种方法有什么区别吗?
差异,我的意思是所需的时间/空间/内存的差异或两者完全相同(即x> 2由x>>> 1实现)?

也是以相同的方式实现与其他数字的乘法/除法而不是2(即5 * 5 = 10 * 2 5 * 1 = 10 <1 5 = 25)?

解决方法 这个问题已经在rIDiculousfishblog上得到了回答: http://ridiculousfish.com/blog/posts/will-it-optimize.html

division by 2 to right shift

Will GCC transform an integer division by 2 to a right shift?

@H_301_31@
int halve_it(int x) {   return x / 2;}int halve_it(int x) {   return x >> 1;}

The right shift operator is equivalent to division that rounds towards
negative infinity,but normal division rounds towards zero. Thus the
proposed optimization will produce the wrong result for odd negative
numbers.

The result can be “fixed up” by adding the most significant bit to the
numerator before shifting,and gcc does this.

@H_301_31@

优秀的程序员让编译器优化他们的代码,除非他们遇到性能损失.

编辑:既然你要求官方消息来源,让我们引用C99的标准理由文件.你在这里找到它:http://www.open-std.org/jtc1/sc22/wg14/www/docs/C99RationaleV5.10.pdf

In C89,division of integers involving negative operands Could round upward or downward in an implementation-defined manner; the intent was to avoID incurring overhead in run-time code to check for special cases and enforce specific behavior. In Fortran,however,the result will always truncate toward zero,and the overhead seems to be acceptable to the numeric programming community. Therefore,C99 Now requires similar behavior,which should facilitate porting of code from Fortran to C. The table in §7.20.6.2 of this document illustrates the required semantics.

@H_301_31@

你的优化在C89中是正确的,因为它让编译器按照自己的意愿去做.但是,C99引入了一个符合Fortran代码的新约定.以下是除法运算符的预期示例(始终来自同一文档):

不幸的是,您的优化不符合C99标准,因为它没有给出x = -1的正确结果:

#include <stdio.h>int div8(int x){    return x/3;}int rs8( int x ){    return x >> 3;}int main(int argc,char *argv[]){    volatile int x = -1;    printf("div : %d \n",div8(x) );    printf("rs : %d \n",rs8(x) );    return 0;}Result:div : 0 rs : -1 [Finished in 0.2s]

如果查看已编译的代码,可以发现一个有趣的区别(使用g v4.6.2编译):

0040138c <__Z4div8i>:  40138c:   55                      push   %ebp  40138d:   89 e5                   mov    %esp,%ebp  40138f:   8b 45 08                mov    0x8(%ebp),%eax  401392:   85 c0                   test   %eax,%eax  401394:   79 03                   jns    401399 <__Z4div8i+0xd>  401396:   83 c0 0f                add    x7,%eax  401399:   c1 f8 04                sar    x3,%eax  40139c:   5d                      pop    %ebp  40139d:   c3                      ret    0040139e <__Z3rs8i>:  40139e:   55                      push   %ebp  40139f:   89 e5                   mov    %esp,%ebp  4013a1:   8b 45 08                mov    0x8(%ebp),%eax  4013a4:   c1 f8 03                sar    x3,%eax  4013a7:   5d                      pop    %ebp  4013a8:   c3                      ret

在第401392行,有一个测试指令,它将检查奇偶校验位,如果数字为负,则将加1 <<<右移3个单位之前(n-1)= 7到x.

总结

以上是内存溢出为你收集整理的c – x / 2和x >> 1或x * 2和x << 1的差值,其中x是整数全部内容,希望文章能够帮你解决c – x / 2和x >> 1或x * 2和x << 1的差值,其中x是整数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1224036.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存