[轉]C語言中 有符號數、無符號數、整數溢出

在學習nginx的源碼時看到了這樣的一個轉換,不明白,查了一下,找到了這樣的一篇文章,轉過來了。nginx

nginx中的代碼:web

case 'M':函數

                ms = (ngx_msec_t) va_arg(args, ngx_msec_t);學習

                /* judge if ms equals 0xffffffff */ui

                if ((ngx_msec_int_t) ms == -1) {spa

                    sign = 1;orm

                    i64 = -1;對象

                } else {blog

                    sign = 0;ci

                    ui64 = (uint64_t) ms;

                }

/////////////////////////////////////////////////////////////////////////////

C語言中存在兩種整數算術運算,有符號型和無符號型。無符號數運算:全部無符號數運算都是以2的n次方爲模,(n是結果中的位數)。因此它不存在運算時的沒有那種所謂的「溢出」,當它超過範圍時,從零開始從新計數!當一個無符號數和有符號數相加的時候,有符號數會自動轉化爲無符號數參與運算!有符號數運算: 是可能發生「溢出」的,並且「溢出」的結果不固定。

     關於無符號數減去無符號數的用法錯誤:

if ( i - j >=0) 假如i,j爲無符號數,這樣寫可能會引起錯誤,即當i小於j的時候,這個式子仍然成立,由於無符號數始終是大於等於零的。例: if ( strlen( a ) >= 10) 與 if (strlen ( b ) -10 >= 0) 這兩條語句是不相等的 ,由於strlen函數返回的是無符號數類型。

   ANSI C規定在無符號整數和有符號整數之間進行強制類型轉換時,位模式不該該改變。類型轉換並未改變對象的位模式,改變的是位模式的解釋方式

    有符號數轉換爲無符號數時,負數轉換爲大的正數(能夠理解爲原值加上2的n次方),而正數保持不變。

    無符號數轉換爲有符號數時,對於小的數將保持原值,對於大的數則轉換爲負數(能夠理解爲原值減去2的n次方)。

<原文完>

http://jinguo.iteye.com/blog/212049

參考:

相關文章
相關標籤/搜索