看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
firejox:因為%d呀.... 07/09 14:00
uranusjr:只要括弧裡面不為零, 對 if 而言就是 true 啊... 07/09 14:02
firejox:製造32個1 --> ~0 07/10 00:23
ohya0524:感謝二樓 我一直以為<=0就是false 07/10 00:41
angleevil:no,only zeo is false. 07/10 02:49
firejox:@angleevil: what's the zeo? 07/10 03:13
Favonia:建議用 uint_32 和 PRIu32 取代 (unsigned) int 或 %d, 07/10 04:58
Favonia:然後最好避免 1<<31 這種寫法,因為你也不知道 "1" 多寬 07/10 05:00
Favonia:如果 2^31 沒辦法由產生出來的型態表示,結果是「未定義」 07/10 05:01
Favonia:(結論是這個程式在你現在電腦上大概是未定義...) 07/10 05:02
Favonia:忠告是 (1) 用 unsigned 較安全 (2) 確定寬度才 shift 07/10 05:04
james732:請問上面的 (2) 要怎麼確定寬度呢? 07/10 05:07
james732:難不成 shift 之前都要用 sizeof 算一下? 07/10 05:08
Favonia:不好意思七樓我腦殘打錯了... uint_32 應該是 uint32_t 07/10 05:09
Favonia:@james732: 我想可以用有指定寬度的整數型態 :Q 07/10 05:10
Favonia:PS: 我講的「安全」是說敢宣稱符合標準的實作都無法惡搞你 07/10 05:14
james732:喔喔,也就是你前面推文說的 uint32_t 取代 int 囉,了解 07/10 07:12
firejox:應該是int32_t取代int吧...(uint32_t沒有負數)... 07/10 13:49
Favonia:問題是用 << 來產生 overflow 其實利用了未定義行為 :P 07/10 14:30
firejox:overflow嗎... 不過有時利用overflow是很方便的~~ 07/10 15:46
firejox:不過要用uint32_t 還得include stdint.h 就是了... 07/10 15:49
firejox:至少這只是在本機測的code... 07/10 15:51
angleevil:zeo->zero,Sorry 07/10 17:19
Favonia:@firejox: 對... 更麻煩的是那個 PRIuN 要 inttypes.h xD 07/10 21:58