首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一段英文注释的解释,和一段代码的含义

2013-03-22 
求助:一段英文注释的解释,和一段代码的含义Compute the sign of an integerint v// we want to find the

求助:一段英文注释的解释,和一段代码的含义
Compute the sign of an integer
int v;      // we want to find the sign of v
int sign;   // the result goes here 

// CHAR_BIT is the number of bits per byte (normally 8).
sign = -(v < 0);  // if v < 0 then -1, else 0. 
// or, to avoid branching on CPUs with flag registers (IA32):
sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
// or, for one less instruction (but not portable):
sign = v >> (sizeof(int) * CHAR_BIT - 1); 
The last expression above evaluates to sign = v >> 31 for 32-bit integers. This is one operation faster than the obvious way, sign = -(v < 0). This trick works because when signed integers are shifted right, the value of the far left bit is copied to the other bits(算术右移). The far left bit is 1 when the value is negative and 0 otherwise; all 1 bits gives -1. Unfortunately, this behavior is architecture-specific.

文中红色字体的注释含义和代码中的(int)((unsigned int)((int)v)这么做类型转换的意图,请大家帮忙解释一下。多谢。
[解决办法]
一段英文注释的解释,和一段代码的含义
[解决办法]
一段英文注释的解释,和一段代码的含义
[解决办法]
一段英文注释的解释,和一段代码的含义
[解决办法]
一段英文注释的解释,和一段代码的含义
[解决办法]


 int sign = -(v < 0);
00E412C0  xor         eax,eax  
00E412C2  cmp         dword ptr [v],0  //cmp一般用于分支语句中,比较结果保存在eax中  
00E412C6  setl        al  //这就是所谓的cpu branch,这种语句往往会影响cpu指令预编译
00E412C9  neg         eax  
00E412CB  mov         dword ptr [sign],eax  
 sign = -(int)((unsigned int)(int)v >> (sizeof(int)*8-1));
00E412CE  mov         eax,dword ptr [v]  


00E412D1  shr         eax,1Fh  //确保执行逻辑右移,效率会更高
00E412D4  neg         eax  
00E412D6  mov         dword ptr [sign],eax  


[解决办法]
 to avoid branching on CPUs with flag registers (IA32):
 为了避免在“有多个具有32位标志寄存器的CPU”上产生歧义(不同的结果)?
[解决办法]
不错 很好~~~~~~~~~~~~~~~~
[解决办法]
不懂耶,,,~
[解决办法]
dafdafsadfadasfdsads
[解决办法]
一段英文注释的解释,和一段代码的含义
[解决办法]
一段英文注释的解释,和一段代码的含义
[解决办法]
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

[解决办法]

[解决办法]
一段英文注释的解释,和一段代码的含义
[解决办法]
一段英文注释的解释,和一段代码的含义
[解决办法]
24楼说的有点问题。
自己确认后,IA32是没有分支预测的。所以branching的代价很高。
[解决办法]
引用:
引用:to avoid branching on CPUs with flag registers (IA32):
 为了避免在“有多个具有32位标志寄存器的CPU”上产生歧义(不同的结果)?
branching 这里指的是分支(也就是条件跳转),由于条件跳转会严重影响CPU程序的速度,所以这里说要avoid branching.
……


受教了。对CPU的工作真不熟
[解决办法]
引用:
C/C++ code?1234567891011 int sign = -(v < 0);00E412C0  xor         eax,eax  00E412C2  cmp         dword ptr [v],0  //cmp一般用于分支语句中,比较结果保存在eax中  00E412C6  setl        al  //这就是所谓的cpu branch……

倒是把汇编忘了!一段英文注释的解释,和一段代码的含义
[解决办法]

[解决办法]
一段英文注释的解释,和一段代码的含义
[解决办法]
  不巧 和大神名字冲突了!
[解决办法]
一段英文注释的解释,和一段代码的含义
[解决办法]
一段英文注释的解释,和一段代码的含义
[解决办法]
一段英文注释的解释,和一段代码的含义
[解决办法]
sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));

v本来就是int型,为什么还这么来一下?
[解决办法]
这个不是很懂
[解决办法]
sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
我是说标红的那个int,不是前面那个

[解决办法]
一段英文注释的解释,和一段代码的含义一段英文注释的解释,和一段代码的含义
[解决办法]
符号跟数值的表示法,补码,反码有关吧。不清楚这个代码可不可移植。


[解决办法]
分支预测错误, 则整个流水线废了

For Pentium 4 and Intel Xeon processors, the branch delay for a 
correctly predicted instruction can be as few as zero clock cycles. The branch delay 
for a mispredicted branch can be many cycles, usually equivalent to the pipeline 
depth. 

一段英文注释的解释,和一段代码的含义
[解决办法]
LZ的和下面的.内涵,都是一样的,这是经典用法. 取消分支.
参见上图, 流水线,解码,  某port在执行时, 前面的各种流程,已经在执行下面一条乃至多条的准备工作.

如果,分支错了, 一切回到解放前,过程的准备工作,全部重来.
一段英文注释的解释,和一段代码的含义
[解决办法]
我是来顶53楼的。
[解决办法]
不懂的啊!!!!
[解决办法]
一段英文注释的解释,和一段代码的含义

热点排行