printf(%d, -10u); 这个输出什么呀, 0或1?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? printf("%d", -1<0u); 這個輸出什么呀, 0或1?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?周銀輝?
?
既然我這么問了, 那么答案自然不是1,而是0
看看下面的代碼:
?
對于-1+0u輸出為-1,似乎理所當然,但為什么-1<0u卻輸出0呢,也就是說-1不小于0u,好神奇啊
一個解釋是:“當執(zhí)行一個運算時, 如果它的一個運算數(shù)是有符號的而另一個是無符號的,那么C會隱含地將有符號參數(shù)強制類型轉(zhuǎn)換為無符號數(shù),并假設這兩個數(shù)都是非負的,來執(zhí)行這個運算” (來自《深入理解計算機系統(tǒng)(修訂版)49頁》),-1的有符號表示為1111....1111(N個1,N取決于位寬,我們假設32個吧),如果強制解釋為無符號數(shù),那么就是2^32:?4294967296 ,當然比0大咯,所以輸出0(false)
當,我暈,在執(zhí)行-1+0u運算時,C似乎又不愿意采用這種方式了,而是(我猜的)將0u采用“零擴展”的方式向上轉(zhuǎn)型為有符號數(shù)的0,那么-1+0,就自然得到-1了
這兩種解釋似乎是矛盾的, 我很奇怪在運算-1<0u時為啥不用“零擴展”向上轉(zhuǎn)型,而輸出1呢,我們也希望得到1,對吧~
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhouyinhui/archive/2010/06/17/1759396.html
總結(jié)
以上是生活随笔為你收集整理的printf(%d, -10u); 这个输出什么呀, 0或1?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ActiveMQ在C#中的应用
- 下一篇: 存储过程中返回结果集