[問題] 位元運算

看板C_and_CPP作者 (歐爺)時間14年前 (2011/07/09 13:37), 編輯推噓1(1023)
留言24則, 6人參與, 最新討論串1/4 (看更多)
開發平台(Platform): GCC 問題(Question):為什麼答案是負的,但是if的結果卻是對的? 程式碼(Code): #include<stdlib.h> #include<stdio.h> int main() { unsigned int ip; ip=255; ip<<=8; ip+=255; ip<<=8; ip+=255; ip<<=8; ip+=255; //ip=連續32個1 printf("%d\n",ip&(1<<31)); if(ip&(1<<31)) printf("YES\n"); system("pause"); return 0; } 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.232.247.38

07/09 14:00, , 1F
因為%d呀....
07/09 14:00, 1F

07/09 14:02, , 2F
只要括弧裡面不為零, 對 if 而言就是 true 啊...
07/09 14:02, 2F

07/10 00:23, , 3F
製造32個1 --> ~0
07/10 00:23, 3F

07/10 00:41, , 4F
感謝二樓 我一直以為<=0就是false
07/10 00:41, 4F

07/10 02:49, , 5F
no,only zeo is false.
07/10 02:49, 5F

07/10 03:13, , 6F
@angleevil: what's the zeo?
07/10 03:13, 6F

07/10 04:58, , 7F
建議用 uint_32 和 PRIu32 取代 (unsigned) int 或 %d,
07/10 04:58, 7F

07/10 05:00, , 8F
然後最好避免 1<<31 這種寫法,因為你也不知道 "1" 多寬
07/10 05:00, 8F

07/10 05:01, , 9F
如果 2^31 沒辦法由產生出來的型態表示,結果是「未定義」
07/10 05:01, 9F

07/10 05:02, , 10F
(結論是這個程式在你現在電腦上大概是未定義...)
07/10 05:02, 10F

07/10 05:04, , 11F
忠告是 (1) 用 unsigned 較安全 (2) 確定寬度才 shift
07/10 05:04, 11F

07/10 05:07, , 12F
請問上面的 (2) 要怎麼確定寬度呢?
07/10 05:07, 12F

07/10 05:08, , 13F
難不成 shift 之前都要用 sizeof 算一下?
07/10 05:08, 13F

07/10 05:09, , 14F
不好意思七樓我腦殘打錯了... uint_32 應該是 uint32_t
07/10 05:09, 14F

07/10 05:10, , 15F
@james732: 我想可以用有指定寬度的整數型態 :Q
07/10 05:10, 15F

07/10 05:14, , 16F
PS: 我講的「安全」是說敢宣稱符合標準的實作都無法惡搞你
07/10 05:14, 16F

07/10 07:12, , 17F
喔喔,也就是你前面推文說的 uint32_t 取代 int 囉,了解
07/10 07:12, 17F

07/10 13:49, , 18F
應該是int32_t取代int吧...(uint32_t沒有負數)...
07/10 13:49, 18F

07/10 14:30, , 19F
問題是用 << 來產生 overflow 其實利用了未定義行為 :P
07/10 14:30, 19F

07/10 15:46, , 20F
overflow嗎... 不過有時利用overflow是很方便的~~
07/10 15:46, 20F

07/10 15:49, , 21F
不過要用uint32_t 還得include stdint.h 就是了...
07/10 15:49, 21F

07/10 15:51, , 22F
至少這只是在本機測的code...
07/10 15:51, 22F

07/10 17:19, , 23F
zeo->zero,Sorry
07/10 17:19, 23F

07/10 21:58, , 24F
@firejox: 對... 更麻煩的是那個 PRIuN 要 inttypes.h xD
07/10 21:58, 24F
文章代碼(AID): #1E5-Z-ZW (C_and_CPP)
文章代碼(AID): #1E5-Z-ZW (C_and_CPP)