This topic has been archived. It cannot be replied.
-
工作学习 / IT技术讨论 / 学艺不精,特来请教高人。有一段代码:#define NEWER_THAN(ts1,ts2) \
((guint32)((guint32)(ts1) - (guint32)(ts2))< (guint32)(1<<31))
在WIN+VC下测试(1《31)为-2147483648,哪错了?为什么它要这么比呢?
-tea(Let it be);
2005-1-17
(#2078902@0)
-
1<<31 是最大的32bit负整数,如果小于此数,说明用的是64-bit平台。
-canadiantire(轮胎-扎了三个钉子!);
2005-1-17
(#2078904@0)
-
但是代码上下文是普通的时间戳(timestamp)的比较,因该就是阿a-b<0,这类玩意,就是不明白为什么要跟(1<<31)比,难道在unix下它会是-0吗?
-tea(Let it be);
2005-1-17
(#2078905@0)
-
能否给一个用到这个Macro的地方的例子,比如几行code
-canadiantire(轮胎-扎了三个钉子!);
2005-1-17
(#2078907@0)
-
if (RTP_TIMESTAMP_IS_STRICTLY_NEWER_THAN(oldest,timestamp))
{
g_message("rtp_getq(): asking for too old packet ! oldest=%i",oldest);
return NULL;
}
定义见内#define RTP_TIMESTAMP_IS_STRICTLY_NEWER_THAN(ts1,ts2) \
( ((guint32)((guint32)(ts1) - (guint32)(ts2))< (guint32)(1<<31)) && (ts1)!=(ts2) )
-tea(Let it be);
2005-1-17
{141}
(#2078909@0)
-
我真购马虎的,是uint.所以1<<31是0x80000000。如果结果大于等于0x80000000,表示结果溢出了
-canadiantire(轮胎-扎了三个钉子!);
2005-1-17
(#2078914@0)
-
同马虎同马虎!!你不说我还没注意到那个u.谢谢。
-tea(Let it be);
2005-1-17
(#2078917@0)
-
嘿嘿
-canadiantire(轮胎-扎了三个钉子!);
2005-1-17
(#2078921@0)
-
但是:即便没有符号位的问题,哦还是不明白它跟个很大的数比个什么劲,看这个定义:#define RTP_TIMESTAMP_IS_NEWER_THAN(ts1,ts2) \
((guint32)((guint32)(ts1) - (guint32)(ts2))< (guint32)(1<<31))
和这个应用:if ( RTP_TIMESTAMP_IS_NEWER_THAN(timestamp,tmprtp->timestamp) )
{
tmp=getq(q); /* dequeue the packet, since it has an interesting timestamp*/
g_message("rtp_getq: Found packet with ts=%i",tmprtp->timestamp);
return(tmp);
岂不是来个包就取,if 总是1?
-tea(Let it be);
2005-1-17
{275}
(#2078920@0)
-
猜的:如果timestamp以毫秒为单位的话,uint32大概是50天左右,所以那个 if 有可能为 0 的。
-exception(违例);
2005-1-18
(#2082157@0)
-
HELP!PLEASE!!
-tea(Let it be);
2005-1-17
(#2079032@0)
-
1<<31: 2^31=8FFF(hex) = 2147483648(unsigned) =???(signed). the maxinum unsigned number is -1 which is FFFF(hex). note: the word size is 4Byte(32bit) here.
-647i(盲人协会);
2005-1-19
(#2082392@0)