2010-07-29 72 views
5

tôi muốn so sánh hai thập lục phân (được lưu trữ trong dài) dưới đây là mã của tôiSo sánh hai giá trị thập lục phân trong C++

long constant = 80040e14; 
if(constant == 80040e14) 
    cout<<"Success"<<endl; 
else 
    cout<<"Fail!!"<<endl; 

Trong điều khiển lưu lượng mã này luôn trở lại một phần khác, bất cứ ai có thể xin đề nghị cách thức tiến hành với sự so sánh.

Cảm ơn

Santhosha K

+0

Tôi ngạc nhiên nó biên dịch –

+2

@Binary hay lo lắng: Nó biên dịch chỉ với 'nhân vật e' (vì nó được thực hiện như số mũ). Đối với mỗi nhân vật hex khác của nó một lỗi trình biên dịch. – Naveen

+0

LOL ...........! –

Trả lời

13

Prefix hằng của bạn với '0x'.

Hằng số của bạn chỉ có 'e' trong đó và trình biên dịch sẽ xử lý các số dạng: NNNeEEE làm ký pháp khoa học. Sử dụng tiền tố '0x' cho trình biên dịch biết rằng các ký tự sau nằm trong ký hiệu thập lục phân.

Trong mã của bạn, 80040e14 là 8004000000000000000 quá lớn để vừa với giá trị 32 bit nhưng có thể vừa với giá trị 64 bit. Nhưng, 80040e14 là một số dấu phẩy động để so sánh sẽ chuyển đổi dài thành một phao để làm cho nó cùng loại với hằng số và do đó hai giá trị sẽ khác nhau do sự phức tạp của mã dấu phẩy động.

+0

+1 - Đây là câu trả lời hoàn chỉnh nhất. – Shaihi

0

Bạn có muốn so sánh hex không?
Sử dụng 0x80040e14 -> chú ý tiền tố 0x để cho trình biên dịch biết đó là định dạng thập lục phân.

Cách bạn viết trình biên dịch có thể thử phân tích cú pháp dưới dạng float (e có nghĩa là mũ), nhưng tôi đã không thực sự thử nó để xem nó xử lý như thế nào.

+0

Gnu g ++ 4.4.3 cho cảnh báo này: "tràn trong chuyển đổi liên tục ngầm" – Kristian

2

Đối với giá trị thập lục phân bạn cần phải thêm tiền tố hằng số với 0x Nếu không e được thực hiện như là một số mũ và giá trị được hiểu như là một giá trị rất lớn thập phân. Trong trường hợp của bạn, hầu hết có lẽ giá trị này không thể được lưu trữ trong một thời gian dài và nó tràn. Vì lỗi này, kiểm tra so sánh của bạn không thành công.

3

Bạn cần đặt 0x trước số thập lục phân của mình trong C++

1

Để so sánh hai giá trị sử dụng toán tử ==. Điều duy nhất cần xem xét là nói trình biên dịch mà cơ sở là giá trị sử dụng:

  • Decimal: ghi số như mọi khi bạn làm trong "cuộc sống thực". Ví dụ: 1 (một), 2 (hai), 3 (ba), ...

  • Hệ thập lục phân: Bạn phải thêm 0x vào giá trị. Ví dụ: 0x01 (một), 0x02 (hai), 0x03 (ba), ...

  • Nhị phân: Nối 0b. Ví dụ: 0b01 (một), 0xb10 (hai), 0b11 (ba). Chỉnh sửa: có vẻ như điều này không đúng. Đừng tin tưởng vào tính năng này.

Trong ví dụ của bạn, chỉ cần làm:

long constant = 0x80040e14; 
if(constant == 0x80040e14L) 
    cout<<"Success"<<endl; 
else 
    cout<<"Fail!!"<<endl; 
+0

C++ không có định dạng nhị phân cho chữ. Tiền tố '0x' cho biết hệ thập lục phân, tiền tố '0' biểu thị số bát phân. '0b01' và '0b11' sẽ tạo ra cả lỗi trình biên dịch ('b' là ký tự bát phân không hợp lệ) và '0xb10' là 2832 theo dạng thập phân. – Skizz

+0

Rất tiếc, đó là một tính năng tôi chỉ được sử dụng trong C, tôi giả định sai C++ thừa hưởng nó. –

+0

Nó không phải là C hoặc (có thể là một phần mở rộng của trình biên dịch) – MSalters

0

80040E14 là một đôi. Khi được gán cho một thời gian dài nó sẽ trở thành số không. 80040e14L dài gấp đôi. biểu thức

constant == 80040e14L 

thúc đẩy liên tục vào một đôi dài, do đó bạn có

0.0 == 80040e14 
Các vấn đề liên quan