2013-03-11 34 views
6

Từ The Open Group Cơ sở kỹ thuật Issue 7, IEEE Std 1.003,1-2008:Tại sao ký hiệu (-0) trả về 0?

Các signbit() vĩ mô sẽ trả về một giá trị khác không khi và chỉ khi dấu có giá trị đối số của nó là tiêu cực .

Tại sao signbit(-0) trả lại 0? Tôi chỉ muốn hiểu được logic đằng sau quyết định này.

+4

Phải sử dụng phần bổ sung của hai – Mike

+1

0 được biểu thị nội bộ dưới dạng 0000000 (tốt, trong 8 bit), có bit dấu là 0 (do đó nó trả về 0), -1 chẳng hạn được thể hiện bên trong là 11111111 (trong 8 bit) bit là 1. Đây là những gì bạn đang nhìn thấy –

Trả lời

9

Trong signbit(-0):

  • 0 là một hằng số kiểu int.
  • -0 là kết quả của việc phủ nhận 0, vì vậy, không phải là loại int.
  • Giá trị này được chuyển đổi thành dấu phẩy động.
  • Các bit dấu trong giá trị dấu chấm động là zero, vì vậy signbit(-0) sản xuất 0.

Nếu bạn làm signbit(-0.) thay vì:

  • 0. là một hằng số kiểu double.
  • -0. là kết quả của việc phủ nhận 0., do đó, đó là số không âm loại double.
  • Các bit dấu trong giá trị dấu chấm động là một, vì vậy signbit(-0.) sản xuất 1.

Điều quan trọng là -0 phủ nhận một kiểu số nguyên, và các loại nguyên thường không mã hóa không tiêu cực như khác biệt với một số không dương. Khi một số nguyên không được chuyển đổi thành dấu phẩy động, kết quả là một số không đơn giản (dương).Tuy nhiên, -0. phủ nhận loại dấu phẩy động và các loại dấu phẩy động mã hóa số không âm rõ ràng từ số không dương.

+0

C có tôn trọng chữ '-0.0' và giữ nó âm? Tôi chưa bao giờ phải quan tâm trước đây, vì vậy tôi không bao giờ kiểm tra ... – cHao

+1

cHao: Tiêu chuẩn cơ sở C không nghiêm ngặt về cách xử lý dấu phẩy động. Các triển khai điển hình, đặc biệt là những người sử dụng IEEE 754, sẽ duy trì bit dấu trong các số 0 dấu chấm động, đặc biệt là trong các phép toán đơn giản. (Ví dụ: tôi sẽ không ngạc nhiên nếu thói quen thư viện trong một số triển khai ít nghiêm ngặt hơn trong việc xử lý dấu hiệu.) –

11

Trong phần bổ sung của hai, đây là biểu diễn phổ biến nhất cho các số nguyên đã ký trong những ngày này, không có điều gì là số không âm. -0 == +0 trong mọi trường hợp, thậm chí bitwise. Vì vậy, vào thời điểm mã của macro xử lý nó, ngay cả khi nó bao gồm ((float) -0), dấu hiệu đã biến mất.

Nếu bạn muốn thử nghiệm, bạn có thể có may mắn hơn với một cái gì đó như signbit(-0.0) hoặc signbit(-1.0 * 0). Vì bạn không chuyển đổi từ một số nguyên tại thời điểm đó, số vẫn nên có một dấu hiệu.

+1

Macro bit dấu hiệu chỉ hoạt động trên dữ liệu dấu chấm động, thường không được biểu diễn trong phần bổ sung của hai. –

+0

@StephenCanon: Vâng. Điều này thật khó xử. :) Hy vọng rằng lời giải thích cố định bao gồm điều đó. – cHao

2

Không. Macro signbit trả về ký hiệu chữ của một mốc dữ liệu dấu phẩy động. Lưu ý văn bản: "nếu dấu của đối số" là số âm, không phải "nếu đối số" là số âm.

Footnote 236 trong tiêu chuẩn C làm rõ:

vĩ mô signbit báo cáo dấu hiệu của tất cả các giá trị, bao gồm infinities, số không, và Nans.

Đây có phải là câu hỏi giả định hoặc bạn có triển khai lỗi không?

+0

Tôi chỉ học C và thử nghiệm các chức năng khác nhau. – syntagma

+2

Bit dấu của '-0' là' 0'. Nó không được quảng cáo cho một loại dấu phẩy động cho đến sau khi bit dấu bị mất. –

+0

@JonathanGrynspan: phải, tôi đã không giải thích 'ký hiệu (-0)' là văn bản chương trình theo nghĩa đen, nhưng có lẽ tôi nên có. –