2013-07-25 29 views
9

Đây là mã vấn đề của tôi:Ký hiệu char c = 255 là "11111111" hay không?

#include "stdio.h" 

int main() 
{ 
     char a = -1; 
     unsigned char b = 255; 
     unsigned char c = 0; 
     if((~a) == c) 
       printf("OK 1"); 
     else 
       printf("bad 1"); 
     printf("\n"); 
     if((~b) == c) 
       printf("OK 2"); 
     else 
       printf("bad 2"); 
     printf("\n"); 
} 

tôi mong đợi này để in:

OK 1 

OK 2 

Nhưng, tôi nhận được OK 1 và xấu 2!

Nếu unsigned char b là 255 (11111111), thì ~ b phải là 00000000. Tại sao nó không bằng c?

Tôi làm việc trên Linux SUSE, sử dụng gcc.

Trả lời

12

Bạn bị cắn bởi các chương trình khuyến mãi số nguyên. Khi bạn làm:

~b == c 

bc cả được thăng tiến để int. Điều đó có nghĩa bạn đang thực sự làm:

~0x000000ff == 0 

rằng kết thúc lên so sánh:

0xffffff00 == 0 

nào không khớp. Nó hoạt động trong trường hợp đầu tiên của bạn bởi vì loại char của bạn được ký kết, và được quyền ký mở rộng trong việc thúc đẩy:

~a == c 
~(-1) == 0 
~0xffffffff == 0 
0 == 0 
+0

Bạn có thể sử dụng một số mã để chứng minh điều đó không? Thật khó tưởng tượng được –

+5

* Mã * của bạn chứng minh điều đó. Nó chỉ là cách C hoạt động. –

+0

OK, bạn đã đúng. –

2

Bởi vì chương trình khuyến mãi không thể thiếu tiêu chuẩn: Trong biểu thức ~b, các toán hạng được thăng int, mà có thể là một cái gì đó như 0x000000FF; kết quả là số nguyên 0xFFFFFF00.

Bạn cần phải chuyển đổi kết quả trở lại unsigned char:

if ((unsigned char)(~b) == c) /* ... */ 
+0

+1 nhưng các loại 'char' 4 bit không được tiêu chuẩn cho phép. –

+0

Vâng, nó hoạt động! Tôi nhận được bản in mong đợi –

+0

@CarlNorum: Theo ký hiệu của tôi, 'F' là ký hiệu thứ 256 :-) –