在C99语法中新增加了_Bool 的布尔类型语法,例子如下:
1 #include2 #include 3 4 int main(int argc, char **argv) 5 { 6 _Bool b; 7 b = 0; 8 printf("%d\n", b); 9 b = 1;10 printf("%d\n", b);11 b = 3;12 printf("%d\n", b);13 b = 4;14 printf("%d\n", b);15 printf("%d\n",sizeof(b));16 17 printf("%d\n",b);18 getchar();19 return 0;20 }
结果如下:
反汇编结果如下:
_Bool b; b = 0;0119406E mov byte ptr [b],0 printf("%d\n", b);01194072 movzx eax,byte ptr [b] 01194076 mov esi,esp 01194078 push eax 01194079 push 1195858h 0119407E call dword ptr ds:[1199110h] 01194084 add esp,8 01194087 cmp esi,esp 01194089 call __RTC_CheckEsp (01191136h) b = 1;0119408E mov byte ptr [b],1 printf("%d\n", b);01194092 movzx eax,byte ptr [b] printf("%d\n", b);01194096 mov esi,esp 01194098 push eax 01194099 push 1195858h 0119409E call dword ptr ds:[1199110h] 011940A4 add esp,8 011940A7 cmp esi,esp 011940A9 call __RTC_CheckEsp (01191136h) b = 3;011940AE mov eax,3 011940B3 test eax,eax 011940B5 jne main+73h (011940C3h) 011940B7 mov dword ptr [ebp-0D0h],0 011940C1 jmp main+7Dh (011940CDh) 011940C3 mov dword ptr [ebp-0D0h],1 011940CD mov cl,byte ptr [ebp-0D0h] 011940D3 mov byte ptr [b],cl printf("%d\n", b);011940D6 movzx eax,byte ptr [b] 011940DA mov esi,esp 011940DC push eax printf("%d\n", b);011940DD push 1195858h 011940E2 call dword ptr ds:[1199110h] 011940E8 add esp,8 011940EB cmp esi,esp 011940ED call __RTC_CheckEsp (01191136h) b = 4;011940F2 mov eax,4 011940F7 test eax,eax 011940F9 jne main+0B7h (01194107h) 011940FB mov dword ptr [ebp-0D0h],0 01194105 jmp main+0C1h (01194111h) 01194107 mov dword ptr [ebp-0D0h],1 01194111 mov cl,byte ptr [ebp-0D0h] 01194117 mov byte ptr [b],cl printf("%d\n", b);0119411A movzx eax,byte ptr [b] 0119411E mov esi,esp 01194120 push eax 01194121 push 1195858h 01194126 call dword ptr ds:[1199110h] 0119412C add esp,8 0119412F cmp esi,esp 01194131 call __RTC_CheckEsp (01191136h) printf("%d\n",sizeof(b));01194136 mov esi,esp 01194138 push 1 0119413A push 1195858h 0119413F call dword ptr ds:[1199110h] 01194145 add esp,8 01194148 cmp esi,esp 0119414A call __RTC_CheckEsp (01191136h)
从结果可以看出,不为0就为1;
从反汇编的结果也可以看出
b = 4;011940F2 mov eax,4 011940F7 test eax,eax 011940F9 jne main+0B7h (01194107h) 011940FB mov dword ptr [ebp-0D0h],0 01194105 jmp main+0C1h (01194111h) 01194107 mov dword ptr [ebp-0D0h],1 01194111 mov cl,byte ptr [ebp-0D0h] 01194117 mov byte ptr [b],cl
b = 4
mov eax,4
首相 4 给了eax;
test eax,eax
只要不为0 就为1
这个就是 _Bool 类型的内部机制。
by:ECN14