今天查乙個和rtp協議有關的bug,**不是我寫的,如果是我寫很有可能也會犯這個錯誤。
為了對應這個問題,我先是把網上關於rtp協議的部落格又大致看了一遍,然後有把出錯的函式的功能簡單過了一遍。
又把除錯資訊列印了一遍。最後基本確定是隱式型別轉換的問題,不需要做什麼大的改動。
因為是前人寫的**,理解和修改都得小心翼翼,怕改了引發新的bug。
錯誤**:if ((packet->last_seq_num +
1) != last_seq_num)
//( 其中packet->last_seq_num,last_seq_num均是unsigned short型別)
//數字1預設是 int 型別,這樣就會導致隱式型別轉換,埋下了乙個bug。
正確的**:if ((unsigned short)(packet->last_seq_num + (unsigned short)
1) != last_seq_num)
//注意, 需要兩次強制轉換:① 1預設是int 型別需要強制轉換
// ②(packet->last_seq_num + (unsigned short)
1) 相加的
//的和也需要轉換,否則二者想加溢位後預設型別又是int了
解決了這個bug,讓我對公司強制要求的**規更加認同了,有些**規範我們覺得很死板可能是見識的少,
缺乏對**規範的重視。
c語言隱式型別轉換
隱式型別轉換分三種,即算術轉換 賦值轉換和輸出轉換。1 算術轉換 進行算術運算 加 減 乘 除 取餘以及符號運算 時,不同型別數招必須轉換成同 一型別的資料才能運算,算術轉換原則為 整型提公升 對於所有比int小的型別,包括char,signed char,unsigned char,short,u...
C語言隱式型別轉換
隱式型別轉換分三種,即算術轉換 賦值轉換和輸出轉換。1 算術轉換 進行算術運算 加 減 乘 除 取餘以及符號運算 時,不同型別數招必須轉換成同 一型別的資料才能運算,算術轉換原則為 整型提公升 對於所有比int小的型別,包括char,signed char,unsigned char,short,u...
C 隱式型別轉換
c 定義了一組內建型別物件之間的轉換標準,在必要時它們被編譯器隱式的應用到物件上。發生隱式型別轉換的情景 1,在混合型別的算術表示式中 轉換原則 轉換為最寬的資料型別。也可叫,算術轉換。int ival 5 double dval 3.14 ival 被提公升為double型別 ival dval ...