2011-01-14 33 views
9

Điểm của giá trị ASCII phủ định là gì?Giá trị ASCII âm

int a = '«'; //a = -85 but as in ASCII table '<<' should be 174 
+13

Mã ASCII chỉ đi từ 0 - 127. –

+8

Lưu ý rằng ASCII chỉ hợp lệ cho các giá trị trong khoảng 0 ..127. Cái gọi là * mở rộng ASCII * bao gồm các giá trị từ 128..255 và bạn chỉ thấy một giá trị như vậy ở đây được biểu diễn như một char đã ký. –

+1

"Cái gọi là ASCII mở rộng" không tồn tại. Tuy nhiên, mã hóa byte đơn. – n0rd

Trả lời

3

Không có điều gì như vậy. ASCII là một bảng các ký tự, mỗi ký tự có một chỉ mục, hoặc một vị trí, trong bảng. Không có chỉ số "phủ định".

Một số trình biên dịch, mặc dù, xem xét char là loại dữ liệu tích phân có dấu, đây có thể là lý do cho sự nhầm lẫn ở đây.

Nếu bạn in nó là unsigned int, bạn sẽ nhận được cùng một bit được hiểu là giá trị không dấu (dương).

+1

bạn có nghĩa là 'unsigned char'? – user963241

10

Đây là một artefact của trình biên dịch của bạn char loại là một loại số nguyên, và int là một ký kiểu số nguyên rộng lớn hơn, và do đó hằng số nhân vật được coi là một số âm và đăng nhập mở rộng đến các loại nguyên rộng lớn hơn .

Không có nhiều ý nghĩa trong đó, nó chỉ xảy ra. Tiêu chuẩn C cho phép triển khai trình biên dịch để chọn xem chúng có xem là char để được ký hoặc không ký. Một số trình biên dịch thậm chí có các công tắc thời gian biên dịch để thay đổi mặc định. Nếu bạn muốn chắc chắn về sự ký kết của loại char, viết rõ ràng signed char hoặc unsigned char, tương ứng.

Sử dụng một unsigned char được mở rộng để một int để tránh những giá trị âm int, hoặc mở một toàn bộ hộp mới Pandora và tận hưởng wchar.

+2

Không, đó là vì nhân vật không phù hợp với chữ. Vấn đề xảy ra * trước * 'int' thậm chí đi vào hình ảnh. Chữ kết thúc bằng giá trị -85 do tràn, và sau đó giá trị này -85 được gán cho int. (Có thể đây là những gì bạn muốn nói, và tôi hiểu lầm bạn.) –

+0

@Tomalak: nó chỉ là ngữ nghĩa cho dù unsigned 174 chỉ xảy ra để được ký -85 hoặc cho dù có một tràn. Đối với tôi tràn có nhiều hơn để làm với các tính toán. Cuối cùng, kết quả là như nhau. – stefaanv

+0

@stefaanv: Tốt thôi; đó không phải là những gì tôi đã phản đối. –

9

Không có giá trị âm. ASCII bao gồm các định nghĩa cho 128 ký tự. Các chỉ mục của chúng đều dương (hoặc không!).

Bạn đang thấy giá trị âm này vì ký tự là từ một tập hợp Mở rộng ASCII và quá lớn để vừa với chữ char. Giá trị do đó tràn vào bit của char của bạn (đã ký trên hệ thống của bạn, rõ ràng) xác định tiêu cực.

Cách giải quyết là viết giá trị trực tiếp:

unsigned char a = 0xAE; // « 

Tôi đã viết nó trong ký hiệu thập lục phân cho hội nghị và vì tôi nghĩ rằng nó trông đẹp hơn 174. :)

+1

Chỉ mục của chúng là tất cả các giá trị không âm ;-). –

+0

@Charles: Pfft. : P –

+1

Không có điều nào như "Extended ASCII". –

2

phạm vi ASCII 0..127, ANSI (còn được gọi là 'mở rộng ASCII') dao động trong khoảng 0..255.

Dải ANSI sẽ không vừa với ký tự char (loại mặc định cho các ký tự trong hầu hết các trình biên dịch).

Hầu hết các trình biên dịch có một tùy chọn như 'char' Type là Unsigned (GCC).

+3

Ký hiệu char không phải là "loại mặc định cho ký tự". Sự ký kết của một loại 'char' không đủ tiêu chuẩn là hoàn toàn được chỉ định thực hiện. Ký tự chữ có loại 'char'. Hệ thống của anh ta chỉ xảy ra khi sử dụng một bản thực thi đã ký cho 'char' (như phần lớn các hệ thống phổ biến, tôi tin). –

+0

(Điều này trái ngược với 'int', mà rõ ràng, luôn luôn, giống như' ký int'.) –

+0

Tôi sẽ làm rõ điều này.Tôi có nghĩa là 'mặc định trong hầu hết các trình biên dịch', không phải đặc điểm kỹ thuật. – jv42

1

Tôi đã có đồ tạo tác này. Khi bạn sử dụng char làm biểu tượng bạn không có vấn đề gì. Nhưng khi bạn sử dụng nó như là số nguyên (với isalpha(), vv) và mã ASCII lớn hơn 127, thì 'char' diễn giải là 'char đã ký' và isalpha() trả về một ngoại lệ.Khi tôi cần sử dụng 'char' làm số nguyên, tôi bỏ 'char' thành unsigned:

  • isalpha ((unsigned char) my_char);

@ n0rd: bảng mã KOI8 sử dụng ascii 128-255 và khác codepage quốc gia: http://www.asciitable.com/

0

Trong một đại diện nhân vật, bạn có 8 bit (1 byte) được phân bổ. Trong số này, bit đầu tiên được sử dụng để biểu diễn dấu. Trong trường hợp ký tự chưa ký, nó sử dụng tất cả 8 bit để biểu thị một số cho phép 0 đến 255 trong đó 128-255 được gọi là ASCII mở rộng. Do biểu diễn trong bộ nhớ như tôi đã mô tả, chúng tôi có -1 có giá trị giống như 255, char(-2)==char(254)

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