2010-06-12 48 views
7

Trong C++, chúng ta có thể tạo ra nguyên thủy unsigned. Nhưng chúng luôn tích cực. Có cách nào để tạo các biến âm không dấu? Tôi biết từ unsigned có nghĩa là "không có dấu", vì vậy cũng không phải là một dấu trừ (-) dấu. Nhưng tôi nghĩ C++ phải cung cấp nó.Nguyên thủy âm chưa được ký?

+0

"chưa ký" trong C/C++ thực sự là một từ đồng nghĩa cho không âm. –

+13

Giả sử chúng đại diện cho số âm. – AraK

+1

Câu hỏi thú vị mà tôi chưa từng nghe trước đó. Rất tiếc, câu trả lời là không." –

Trả lời

4

No. unsigned chỉ có thể chứa số không âm.

Nếu bạn cần loại chỉ đại diện cho số âm, bạn cần phải tự viết một lớp hoặc chỉ diễn giải giá trị là âm trong chương trình của bạn.

(Nhưng tại sao bạn cần loại như vậy?)

+0

Vì vậy, nếu tôi thực sự muốn điều này, tôi sẽ cần phải tạo ra lớp học của riêng tôi và làm một số nhà điều hành quá tải để mô phỏng một số âm? –

+0

@KennyTM: Nếu tôi muốn sử dụng ít bộ nhớ nhất có thể. –

+1

@Martijn: Nghe có vẻ như tối ưu hóa sớm. Bạn cần số lượng như thế nào? Phạm vi của những con số đó là gì? – kennytm

2

unsigned số nguyên chỉ dương. Từ 3.9.1 khoản 3 của tiêu chuẩn 2003 C++:

Phạm vi của các giá trị không âm của một ký kiểu số nguyên là một subrange của tương ứng unsigned integer loại, và các đại diện giá trị của mỗi tương ứng ký/unsigned loại sẽ giống nhau.

Mục đích chính của các loại số nguyên không dấu là hỗ trợ số học modulo. Từ 3.9.1 khoản 4:

số nguyên Unsigned, tuyên bố unsigned, phải tuân theo pháp luật của số học modulo 2 n trong đó n là số bit trong các đại diện giá trị đó kích thước cụ thể của số nguyên.

Bạn hoàn toàn miễn phí, để coi chúng là âm nếu bạn muốn, bạn sẽ chỉ phải theo dõi chính mình bằng cách nào đó (có thể với cờ Boolean).

0

Tôi nghĩ bạn đang nghĩ nó sai.

Nếu bạn muốn có số âm, thì bạn không được khai báo biến là chưa ký.

Nếu vấn đề của bạn là phạm vi giá trị, và bạn muốn thêm một chút, thì bạn có thể sử dụng loại dữ liệu "lớn hơn" (ví dụ: int 64 ...). Sau đó, nếu bạn đang sử dụng mã kế thừa, việc tạo cấu trúc mới có thể giải quyết vấn đề của bạn, nhưng đây là cách đó vì tình hình cụ thể của bạn, C++ không nên xử lý nó.

0

Đừng để bị lừa bởi tên: unsigned thường bị hiểu lầm là không âm, nhưng các quy tắc cho ngôn ngữ khác nhau ... có lẽ tên tốt hơn sẽ là "bitmask" hoặc "modulo_integer".

Nếu bạn cho rằng unsigned là không âm thì ví dụ: quy tắc chuyển đổi ngầm là tổng số vô nghĩa (tại sao sự khác biệt giữa hai âm không phải là âm) tại sao phải thêm một số âm và số nguyên không tiêu cực?). Thật không may là bản thân thư viện chuẩn C++ rơi vào sự hiểu lầm đó bởi vì ví dụ vector.size() là unsigned (vô lý nếu bạn ngụ ý nó như là ngôn ngữ chính nó làm về mặt bitmask hoặc modulo_integer).Lựa chọn này cho các kích thước có nhiều hơn để làm với tuổi 16-bit lần so với unsigned-ness và nó đã được trong ý kiến ​​của tôi một sự lựa chọn khủng khiếp mà chúng tôi vẫn đang trả tiền như là lỗi.

+2

Lợi ích nào tạo ra vector.size() đã ký? Nó không bao giờ có thể trả về một giá trị âm. Chính xác lỗi nào phát sinh do ký/unsigned? Đó là một khái niệm khá đơn giản để giải quyết. – Puppy

+0

Lỗi phổ biến nhất mà tôi quan sát được là lặp lại từ 0 đến vector.size() - 1 cho một vectơ trống là một số lớn. Các lỗi có thể xảy ra khác do thực tế là a - b> 0 không giống như a> b. Lưu ý rằng tất cả điều này xảy ra vì không được ký cho C++ nghĩa là nhiều hay ít "phần tử Z [n]" (Z [n] = số nguyên modulo n) và không liên quan gì đến dấu. Theo ý kiến ​​của bạn thì có nghĩa là số lượng các phần tử trong một vector là một phần tử của vòng đó? Unsigned ints là IMO thực sự rất hữu ích ... nhưng không phải là số lượng. – 6502

+1

OK, vì vậy bạn sẽ nhận được một giá trị không mong muốn. Làm thế nào là tốt hơn là nhận được một dòng chảy? Ít nhất bằng cách này bạn không mangling lên bộ nhớ của bạn. –

0

Nhưng tôi nghĩ C++ phải cung cấp.

Tại sao? Bạn nghĩ rằng C + + phải cung cấp khả năng làm cho các số âm không âm? Điều đó thật ngớ ngẩn.

Giá trị chưa ký trong C++ được xác định là không âm. Họ thậm chí quấn xung quanh — thay vì bị thiếu — ở số không! (Và cùng ở đầu kia của dải ô)

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