2009-03-07 41 views
48

Tôi đã thấy những điều này được đề cập trong ngữ cảnh của C và C++, nhưng sự khác nhau giữa các biến được ký và không dấu là gì?Sự khác biệt giữa các biến được ký và không ký là gì?

+0

Tôi nghĩ chúng tôi giả định trong lập trình theo mặc định và không phải khi được gắn thẻ không liên quan đến lập trình? –

+0

Vì vậy, tôi đã tìm thấy khá một vài queestions theo lập trình. Tôi tự hỏi tại sao? – batbrat

+0

Câu hỏi liên quan đến khía cạnh cụ thể của lập trình nói chung. – Sam152

Trả lời

102

Signed biến, chẳng hạn như số nguyên ký sẽ cho phép bạn để đại diện cho số cả trong phạm vi tích cực và tiêu cực.

biến Unsigned, chẳng hạn như số nguyên unsigned, sẽ chỉ cho phép bạn thể hiện con số trong dương.

biến Unsigned và ký cùng loại (ví dụ như intbyte) cả hai đều có cùng một phạm vi (khoảng 65.536 và 256 số, tương ứng), nhưng unsigned có thể đại diện cho một số cường độ lớn hơn tương ứng ký biến .

Ví dụ, một unsigned byte thể đại diện cho các giá trị 0-255, trong khi signed byte thể đại diện -128 để 127.

Trang Wikipedia trên Signed number representations giải thích sự khác biệt trong biểu diễn ở cấp bit và trang Integer (computer science) cung cấp một phạm vi cho mỗi loại số nguyên đã ký/không dấu.

+0

Số dương lớn hơn 0. Số đã ký, ít nhất là trong C, có thể sử dụng bit dấu chứ không phải là biểu diễn bổ sung, do đó, không có cùng phạm vi như chưa được ký do lặp lại +/- số không. Nếu bạn nói một int là 16 bit, hãy nói nền tảng; hệ thống hiện đại nhất là 32 hoặc 64 bit. –

18

Biến được ký sử dụng một bit để gắn cờ cho dù chúng là dương hay âm. Biến chưa được ký không có bit này, do đó, chúng có thể lưu trữ số lớn hơn trong cùng một không gian, nhưng chỉ số không âm, ví dụ: 0 và cao hơn.

Để biết thêm: Unsigned and Signed Integers

+0

s/dương/nonnegative/ – Ken

+0

Yup, cố định để làm rõ hơn. –

+0

cảm ơn, sau 2 phút tìm kiếm trên google, đây là câu trả lời yêu thích của tôi để làm rõ cho tôi – SheldonH

3

Biến không được ký chỉ có thể là số dương, vì chúng thiếu khả năng cho biết chúng là số âm.

Khả năng này được gọi là 'ký hiệu' hoặc 'bit ký'.

Tác dụng phụ là không có bit ký, chúng có thêm một bit có thể được sử dụng để biểu thị số đó, nhân đôi số lượng tối đa mà nó có thể đại diện.

3

Biến được ký có thể là 0, dương hoặc âm.

Biến không được ký có thể là 0 hoặc dương.

Biến chưa được sử dụng đôi khi được sử dụng vì có thể sử dụng nhiều bit hơn để biểu thị giá trị thực. Cung cấp cho bạn phạm vi rộng hơn. Ngoài ra, bạn có thể đảm bảo rằng một giá trị âm sẽ không được chuyển cho hàm của bạn chẳng hạn.

biến
0

Unsigned là các biến được trong nội bộ đại diện mà không có một dấu hiệu toán học (cộng hoặc trừ) có thể lưu trữ 'zero' hoặc các giá trị tích cực chỉ. Giả sử biến chưa ký là n bit về kích thước, sau đó nó có thể đại diện cho giá trị 2^n (2 công suất n) - từ 0 đến (2^n -1). Một biến đã ký, mặt khác, 'mất' một chút để biểu diễn dấu, vì vậy nó có thể lưu trữ các giá trị từ - (2^(n-1) -1) đến (2^(n-1)) bao gồm số không.Do đó, biến được ký có thể lưu trữ giá trị dương, giá trị âm và số không.

PS:
Bên trong, các dấu hiệu toán học có thể được biểu diễn dưới dạng bổ sung của một người, hình thức bổ sung hai hoặc với một chút dấu (ví dụ: 0 -> +, 1-> -)
Tất cả những phương pháp hiệu quả chia phạm vi các giá trị thể hiện trong n bit (2^n) thành ba phần, dương, âm và không.

Đây chỉ là hai xu giá trị của tôi.

Tôi hy vọng điều này sẽ hữu ích.

2

unsigned được sử dụng khi giá trị ur phải là số dương, không có giá trị tiêu cực ở đây, nếu ký hợp đồng với int tầm -32.768-32.767 nếu unsigned int cho phạm vi 0-65.535

37

Trong khi thường được gọi là một ' bit dấu ', các giá trị nhị phân mà chúng ta thường sử dụng không có bit dấu hiệu đúng.

Hầu hết các máy tính sử dụng số học bổ sung hai.Số âm được tạo ra bằng cách lấy one's-bổ sung (lật tất cả các bit) và thêm một:

            5 (decimal) -> 00000101 (binary)
            1's complement: 11111010
            add 1: 11111011 which is 'FB' in hex


Đây là lý do tại sao một byte ký giữ các giá trị từ -128 đến 127 thay vì -127 đến 127:

            1 0 0 0 0 0 0 0 = -128
            1 0 0 0 0 0 0 1 = -127
                    - - -
            1 1 1 1 1 1 1 0 = -2
            1 1 1 1 1 1 1 1 = -1
            0 0 0 0 0 0 0 0 = 0
            0 0 0 0 0 0 0 1 = 1
            0 0 0 0 0 0 1 0 = 2
                    - - -
            0 1 1 1 1 1 1 0 = 126
            0 1 1 1 1 1 1 1 = 127
            (thêm 1-127 cho :)
            1 0 0 0 0 0 0 0       mà chúng ta thấy ở trên cùng của biểu đồ này là -128.


Nếu chúng tôi có bit dấu hiệu thích hợp, phạm vi giá trị sẽ giống nhau (ví dụ: -127 đến +127) vì một bit được dành riêng cho dấu. Nếu nhất-đáng-bit là bit dấu, chúng tôi có:

            5 (decimal) -> 00000101 (binary)
            -5 (decimal) -> 10000101 (binary)

Điều thú vị trong trường hợp này là chúng tôi có cả số 0 và số không âm:
            0 (decimal) -> 00000000 (binary)
            -0 (decimal) -> 10000000 (binary)


Chúng tôi không có -0 với two's-bổ sung; những gì sẽ là -0 là -128 (hoặc là tổng quát hơn, nhiều hơn giá trị dương lớn nhất). Chúng tôi làm với sự bổ sung của một người mặc dù; tất cả 1 bit là âm 0.

Về mặt toán học, -0 bằng 0. Tôi mơ hồ nhớ một máy tính có số 0 < 0, nhưng hiện giờ tôi không thể tìm thấy bất kỳ tham chiếu nào.

+3

Cảm ơn bạn rất nhiều! Tôi đã thực sự bối rối tại sao nó là -128 đến 127 cho một byte đã ký và không -127 đến 127. Câu trả lời này cần nhiều phiếu bầu hơn! –

-1

Đây có thể không phải là định nghĩa chính xác nhưng tôi sẽ cung cấp cho bạn một ví dụ: Nếu bạn tạo một số ngẫu nhiên lấy nó từ thời gian hệ thống, ở đây sử dụng biến chưa ký là có lợi. các con số dưới dạng số đã ký cho cả số dương và số âm. Do thời gian hệ thống không thể âm, chúng tôi sử dụng biến không dấu (Chỉ các số dương) và chúng tôi có nhiều số ngẫu nhiên hơn.

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