2009-07-23 31 views
63

Tôi đã thấy loại hình này unsigned "không có chữ" được sử dụng một vài lần, nhưng chưa bao giờ thấy giải thích cho nó. Tôi cho rằng có loại signed tương ứng. Dưới đây là một ví dụ:kiểu dữ liệu chưa được ký là gì?

static unsigned long next = 1; 
/* RAND_MAX assumed to be 32767 */ 
int myrand(void) { 
    next = next * 1103515245 + 12345; 
    return((unsigned)(next/65536) % 32768); 
} 
void mysrand(unsigned seed) { 
    next = seed; 
}

Những gì tôi đã thu thập được cho đến nay:
- trên hệ thống của tôi, sizeof(unsigned) = 4 (gợi ý tại một int unsigned 32-bit)
- nó có thể được sử dụng như một cách viết tắt cho đúc loại khác tới phiên bản chưa được ký:

signed long int i = -42; 
printf("%u\n", (unsigned)i); 

Đây có phải là ANSI C hay chỉ là phần mở rộng của trình biên dịch?

Trả lời

110

unsigned thực sự là một viết tắt cho unsigned int, và do đó được xác định trong tiêu chuẩn C.

23

unsigned nghĩa unsigned int. signed có nghĩa là signed int. Chỉ sử dụng unsigned là một cách lười biếng để khai báo một số unsigned int trong C. Có đây là ANSI.

6

trong C, unsigned là phím tắt cho unsigned int.

Bạn có giống nhau cho long đó là một phím tắt cho long int

Và nó cũng có thể tuyên bố một unsigned long (nó sẽ là một unsigned long int).

Đây là trong tiêu chuẩn ANSI

+0

Có. 'unsigned' giống như' unsigned int' nhưng tôi đã thực hiện tìm kiếm trên _WG14/N1124 Ủy ban Dự thảo - ngày 6 tháng 5 năm 2005 ISO/IEC 9899: TC2_ cho 'unsigned' và không thể tìm thấy vị trí được xác định ... trích dẫn phần mà nó được xác định? – user454322

11

Trong lịch sử trong C, nếu bạn bỏ qua một kiểu dữ liệu "int" đã được giả định. Vì vậy, "unsigned" là viết tắt của "unsigned int". Điều này đã được coi là thực hành xấu trong một thời gian dài, nhưng vẫn còn một số tiền hợp lý của mã ra có sử dụng nó.

+6

Tôi không biết rằng đó là thực hành không tốt. Có lý do nào cho việc này không? 'long' thay vì' long int' rất phổ biến nên tôi không chắc tại sao 'unsigned' thay vì' unsigned int' sẽ không được chấp nhận. –

+10

@Charles Bailey: những ngày này - ít nhất là nếu bạn đang thực dụng hơn là chính thức - dài, int, ngắn và char được coi là các loại dữ liệu khác nhau vì chúng có thể có kích thước khác nhau) với unsigned (và mặc định, ký) một vòng loại. Vì vậy, bạn sẽ có xu hướng sử dụng "unsigned int" trong cùng một cách bạn sẽ sử dụng "unsigned long" hoặc "unsigned char" (và nó làm cho nó rõ ràng rằng bạn không chỉ bỏ lỡ int). Int trong "long int" hoặc "short int" là thừa. – Dipstick

+1

@Dipstick, "long" là bộ định danh cho "int". Có vẻ như int trong "unsigned int" chỉ là thừa như int trong "unsigned long int." –

3

Trong C và C++

unsigned = unsigned int (Integer type) 
signed = signed int (Integer type) 

Một số nguyên unsigned chứa n bit có thể có một giá trị từ 0 (2^n-1), đó là 2^n giá trị khác nhau.

Một số nguyên không dấu là dương hoặc không.

Số nguyên đã ký được lưu trữ trong máy tính sử dụng phần bổ sung 2.

0

Mang theo số answer from another question của tôi.

Từ C specification, phần 6.7.2:

- unsigned, hoặc unsigned int

Nghĩa là unsigned, khi không quy định loại, sẽ mặc định unsigned int. Vì vậy, viết unsigned a cũng giống như unsigned int a.

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