2012-01-17 41 views
8
int m=32 
printf("%x" , ~m); 

Output của câu này là ffdf và không ~ ra là 20. Tầm quan trọng của %x~ là gì?Tầm quan trọng của% x và ~

+6

Bạn có thể muốn đi qua một số câu hỏi cũ của bạn và chấp nhận câu trả lời tốt nhất, nếu không mọi người có thể không muốn cung cấp câu trả lời hữu ích. – brc

Trả lời

19

Toán tử ~ bị phủ định bitwise. Nó sẽ in phủ định bit của giá trị m. %x có nghĩa là printf sẽ xuất ra giá trị của nó theo định dạng thập lục phân.

Vì vậy, giá trị 0xffdf là phủ định giá trị 0x20 (32).

Giá trị 32 (int bit sẽ được):

0000 0000 0010 0000 

phủ Bitwise của nó sẽ là:

1111 1111 1101 1111 

nào có ý nghĩa từ:

1111 1111 = 0xff 

Và:

1101 1111 = 0xdf 
+1

Cảm ơn bạn rất nhiều vì câu trả lời. –

1

Và% x có nghĩa là bạn in giá trị của x trong hexadecimale.

6

%xprintf format cho biết giá trị int sẽ được hiển thị dưới dạng thập lục phân.

~bitwise NOT, lật tất cả các bit trong số nguyên.

Tuyên bố:

printf("%x", m); 

sẽ hiển thị đầu ra 20 như 0x20 = thập phân 32.

Tuyên bố:

printf("%x", ~m); 

sẽ hiển thị đầu ra ffdf như 0xffdf là nghịch đảo Bitwise của 0x20.

Nó có thể làm cho ý nghĩa hơn để hình dung sự phủ định Bitwise trong hệ nhị phân:

Base 10:   32     65503 
Base 16:  0x20    0xFFDF 
Base 2: 0000000000100000 1111111111011111 
1

~ 32 = -33 sử dụng int unsigned để có được kết quả

+1

Để nhận * kết quả * gì? –

+0

nắm bắt tốt về chi tiết – Omar

+1

4294967263 chắc chắn –

1

Nó có nghĩa là x nên có lẽ đã được tuyên bố unsigned thay vì int.

Định dạng printf "%x" yêu cầu đối số unsigned int và in giá trị của nó theo hệ thập lục phân (cơ sở 16). Bạn có thể sử dụng an toàn thông số này với đối số intnếu giá trị nằm trong phạm vi có thể đại diện hoặc là int hoặc dưới dạng unsigned int (ví dụ: 0 .. INT_MAX).Sử dụng "%x" với giá trị âm int, vì đoạn mã này thực hiện, nói đúng là hành vi không xác định, mặc dù hành vi thực tế có khả năng là hợp lý nhất quán.

Tiêu chuẩn C nói:

Kết quả của các nhà điều hành ~ là sự bổ sung Bitwise của toán hạng (thúc đẩy) của nó (có nghĩa là, mỗi bit trong kết quả được thiết lập khi và chỉ nếu bit tương ứng trong toán hạng được chuyển đổi không được đặt).

Lưu ý rằng nó được xác định theo điều khoản của đại diện của toán hạng, không phải giá trị của nó.

Đầu ra bạn mô tả cho biết rằng bạn đang sử dụng hệ thống có hai số nguyên được bổ sung, trong đó int chỉ là 16 bit, đây là điều bất thường trong những ngày này. (? Bạn đang sử dụng một trình biên dịch Turbo C cổ hoặc một cái gì đó tương tự) Trên hệ thống của tôi, chương trình này:

#include <stdio.h> 
int main(void) { 
    int m = 32; 
    printf("%x\n" , ~m); 
    return 0; 
} 

sản xuất sản lượng này:

ffffffdf 

(Lưu ý rằng tôi đã thêm các yêu cầu #include <stdio.h> và một dấu chấm phẩy trên tờ khai của m.)

2

biểu tượng ~ đại diện cho Bitwise NOT, hoặc nhà điều hành bổ sung; hoạt động đơn nhất thực hiện phủ định hợp lý trên mỗi bit, tạo thành phần bổ sung của các giá trị nhị phân đã cho. Các chữ số nhị phân từ 0 trở thành 1 và các chữ số 1 trở thành 0.

32 là 00100000 dưới dạng nhị phân và ~ 32 là 11011111 theo nhị phân (hoặc 223 chữ số thập phân).

Tùy chọn %x trong chức năng printf sẽ hiển thị định dạng thập lục phân chưa được ký (sử dụng chữ thường).

Vì vậy,

printf("%x", m); // displays the hexadecimal value of 32 (00100000), "20" 

printf("%x", ~m); // displays the hexadecimal value of ~32 (11101111), "ffdf" 


[Nguồn]
http://en.wikipedia.org/wiki/Bitwise_operation#NOT
http://en.wikipedia.org/wiki/Hexadecimal
http://en.wikipedia.org/wiki/Printf_format_string

Các vấn đề liên quan