tags: c 隨筆
今天除錯時,遇到乙個問題,雖然非常非常簡單也非常非常好排查,以至於以前都沒有太在意這個問題。簡要記錄一下。
**:
int recvlen = recvfrom(……);//recvfrom()為windows socket接收的api
if (recvlen > sizeof(socket_msg_head))
這裡面其實是有問題,由於一般自己寫這種類似recvfrom,然後返回接收長度的函式在定義的時候都會刻意的把函式返回值定義為unsigned int型別,而recvfrom()的返回值微軟定義的是乙個有符號型別。
所以說當recvfrom返回-1的時候,recvlen就是大於sizeof(socket_msg_head)的,因為sizeof()被認為是乙個無符號整數,而有符號和無符號整數在比較時,編譯器會把有符號數的符號忽略掉,直接拿記憶體裡面存的實際值來比較,所以-1就是0xffffffff,所以就出現了上述問題。
總結下來:
1、有符號數和無符號數比較時,彙編**被編譯成無符號比較:
00402a26: mov -0x20(%ebp),%eax
00402a29: cmp -0x1c(%ebp),%eax
00402a2c: jbe 0x4029da
這樣的比較在實際中應該避免或者禁止
2、sizeof()的結果編譯器認為是無符號數。
C語言中移位符需要注意的地方
1 無符號值的所有移位操作都是邏輯移位,即是在空位補0,但是對於有符號數,到底是採用邏輯移位還是算術移位是靠編譯器決定的。左移對於算術移位和邏輯移位都是一樣的。因此當你的專案中有移植性的要求時,請注意不要使用有符號數的右移操作,如果沒有移植性的要求時,應在使用有符號數的右移操作的地方,進行注釋說明。...
配置時需要注意的
搭建的時候肯定不會在同一臺主機上搭建。大多都是在不同的伺服器上安裝不同的角色 追蹤器主機上的 配置檔案填寫的是 當前主機的ip 儲存節點主機上的 bind addr 填的就是當前主機的ip 配置中tracker server 填的蹤器的ip和埠 儲存節點的輪詢 就是在新增一次tracker serv...
CString比較時要注意的
最近上班的時候接到乙個需求 1 使用者給定了乙個列表,裡面是一些中英文混雜的字串,標點符號也是混的 比如 序號 名稱 1 1號和a去圖書館 有英文數字 中文 英文小寫 2 和同學b聚會定在 日 有全形數字 中文 英文小寫 3 c的書名是 數學 有中文標點符號 中文 英文大寫 4 jack 是他的名字...