2012-11-25 30 views
14

signed có nghĩa là gì trong C? Tôi có bảng này để hiển thị:Giá trị đã ký và chưa ký nghĩa là gì?

enter image description here

này nói signed char128 để +127. 128 cũng là một số nguyên dương, do đó, làm thế nào điều này có thể giống như +128 đến +127? Hoặc làm 128+127 có ý nghĩa khác nhau? Tôi đang đề cập đến cuốn sách Apress Beginning C.

+2

Bảng chỉ thiếu dấu trừ. Phải có dấu trừ trước số đầu tiên trong mỗi phạm vi giá trị. –

+1

Cảm ơn tất cả mọi người, +1 cho tất cả mọi người ở đây, tôi chắc chắn có gì đó sai với cuốn sách –

Trả lời

26

Số nguyên đã ký có thể biểu thị số âm; unsigned không thể.

Các số nguyên đã ký có hành vi không xác định nếu chúng tràn, trong khi các số nguyên không dấu được bọc xung quanh bằng cách sử dụng modulo.

Lưu ý rằng bảng đó không đúng. Trước hết, nó thiếu các dấu hiệu - (chẳng hạn như -128 đến +127). Thứ hai, tiêu chuẩn không đảm bảo rằng các loại đó phải nằm trong các phạm vi đó.

+0

cảm ơn thông tin bổ sung;) –

4

Bảng thiếu các minuses. Phạm vi của char đã ký là -128 đến +127; tương tự như vậy đối với các loại khác trên bàn.

+0

Đó là nơi tôi đã nhầm lẫn, Đó là cuốn sách apress đang đề cập đến –

1

Ký thường có nghĩa là số có dấu + hoặc - ở phía trước. Điều này có nghĩa là int unsigned, unsigned shorts, etc không được âm.

+0

một unsigned double/float là gì? –

+0

Vâng, nó có liên quan nhiều hơn thế. Đối với một điều, không có những điều như một unsigned đôi/float. –

2

Số đã ký là những số có hoặc được nối với chúng. Ví dụ: +2 và -6 là số đã ký. Số đã ký có thể lưu trữ cả số dương và số âm mà tại sao chúng có phạm vi rộng hơn. i.e -32768 đến 32767

Số chưa ký chỉ đơn giản là số không có dấu hiệu. chúng luôn tích cực. và phạm vi của chúng là từ 0 đến 65535.

Hy vọng điều này sẽ giúp

+2

'Số đã ký có thể lưu trữ cả số dương và số âm mà tại sao chúng có phạm vi rộng hơn. tức là -32768 đến 32767 'Không, chúng không có phạm vi rộng hơn. Họ có một phạm vi _different_. Đó là lý do tại sao ngắn unsigned của bạn đi tất cả các con đường lên đến 65535. –

0

Một số nguyên có thể có cả giá trị âm và dương. Trong khi một số nguyên không dấu chỉ có thể có giá trị dương.

Đối với số nguyên ký sử dụng two's complement, mà thường được sử dụng, phạm vi là (tùy thuộc vào độ rộng bit của số nguyên):

char s -> range -128-127

đâu một char unsigned có khoảng:

unsigned char s -> range 0-255

0

Đầu tiên, bảng của bạn sai ... số âm bị thiếu. Đề cập đến kiểu char .... bạn có thể biểu diễn ở tất cả 256 khả năng vì char có một byte có nghĩa là 2^8. Vì vậy, bây giờ bạn có hai lựa chọn thay thế để thiết lập phạm vi ur. hoặc từ -128 đến +128 hoặc 0 đến 255. Đầu tiên là chữ ký ký số thứ hai là unsigned char. Nếu bạn sử dụng các số nguyên, hãy lưu ý loại hệ điều hành nào bạn đang sử dụng. 16 bit, 32 bit hoặc 64 bit. Int (16 bit, 32 bit, 64 bit). char luôn luôn chỉ có giá trị 8 bit.

6

Theo mặc định, các giá trị bằng số trong C được ký, có nghĩa là chúng có thể vừa âm và dương. Mặt khác, giá trị chưa được ký, không cho phép số âm.

Vì tất cả chỉ là về bộ nhớ, cuối cùng tất cả các giá trị số được lưu trữ dưới dạng nhị phân. Một số nguyên không dấu 32 bit có thể chứa các giá trị từ tất cả các số nhị phân 0 đến tất cả các số nhị phân 1s. Khi nói đến số nguyên có dấu 32 bit, nó có nghĩa là một trong các bit của nó (quan trọng nhất) là một cờ, đánh dấu giá trị là dương hoặc âm. Vì vậy, đó là vấn đề giải thích, cho biết giá trị đó được ký kết.

Giá trị được ký tích cực được lưu trữ giống như giá trị chưa ký, nhưng số âm được lưu trữ bằng cách sử dụng phương thức bổ sung hai của phương thức.

Nếu bạn muốn viết giá trị âm trong nhị phân, trước tiên hãy viết số dương, đảo ngược tiếp theo tất cả các bit và cuối cùng thêm 1. Khi giá trị âm trong bổ sung của hai số được thêm vào một số dương có cùng độ lớn, kết quả sẽ là 0.

trong ví dụ dưới đây cho phép thỏa thuận với con số 8-bit, vì nó sẽ được đơn giản để kiểm tra:

positive 95: 01011111 
negative 95: 10100000 + 1 = 10100001 [positive 161] 
      0: 01011111 + 10100001 = 100000000 
            ^
            |_______ as we're dealing with 8bit numbers, 
              the 8 bits which means results in 0 
1

đó là một lỗi đánh máy trong cuốn sách; ký hiệu char đi từ -128 đến 127.

Số nguyên đã ký được lưu trữ sử dụng biểu diễn two's complement, trong đó bit đầu tiên được sử dụng để biểu thị dấu.

Trong C, ký tự chỉ là số nguyên 8 bit. Điều này có nghĩa rằng họ có thể đi từ - (2^7) đến 2^7 - 1. Đó là bởi vì chúng tôi sử dụng 7 bit cuối cùng cho số và bit đầu tiên cho dấu. 0 có nghĩa là dương và 1 có nghĩa là âm (trong biểu diễn bổ sung của hai).

  • Số 7 chút tích cực lớn nhất là (01.111.111) b = 2^7 - 1 = 127.
  • Số 7 chút tiêu cực nhỏ nhất là (11111111) b = -128
    (vì 11111111 là hai bổ sung của 10000000 = 2^7 = 128).

Ký tự chưa được ký không có dấu hiệu để chúng có thể sử dụng tất cả 8 bit. Đi từ (00000000) b = 0 đến (11111111) b = 255.

0

Tất cả các loại dữ liệu nguyên là loại dữ liệu đã ký, nghĩa là chúng có giá trị dương hoặc âm. Số chưa ký số luôn là số không âm.

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