kiểu dữ liệu không dấu là gì?


90

Tôi đã thấy kiểu unsigned"không đánh máy" này đượ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ó một signedloại tương ứng . Đây là một ví dụ:

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 ý về số int 32-bit không dấu)
- nó có thể được sử dụng như một cách viết tắt để truyền một kiểu khác sang phiên bản không dấu:

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

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

Câu trả lời:


144

unsignedthực sự là cách viết tắt của unsigned int, và được định nghĩa như vậy trong tiêu chuẩn C.


30

unsignedcó nghĩa là unsigned int. signedcó nghĩa là signed int. Sử dụng just unsignedlà một cách lười biếng để khai báo một unsigned inttrong C. Vâng, đây là ANSI.


14

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


6
Tôi không biết rằng đó là một thực hành xấu. Có một cơ sở lý do cho điều này? longthay vì long intrất phổ biến nên tôi không chắc tại sao unsignedthay vì unsigned intsẽ không được chấp nhận.
CB Bailey

10
@Charles Bailey: những ngày này - ít nhất là nếu bạn thực dụng hơn là chính thức - dài, int, short và char được coi là các kiểu 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, có dấu) là vòng loại. Vì vậy, bạn sẽ có xu hướng sử dụng "unsigned int" giống như cách bạn sẽ sử dụng "unsigned long" hoặc "unsigned char" (và nó làm rõ rằng bạn không chỉ bỏ sót int). Int trong "long int" hoặc "short int" là thừa.
Que thăm

1
@Dipstick, "long" là một định nghĩa cho "int". Có vẻ như int trong "unsigned int" cũng thừa như int trong "unsigned long int."
Conrad Meyer

1
Điều này không giống với quy tắc ngầm định "int". Câu trả lời này gây hiểu lầm.

7

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

Bạn có cùng longmột phím tắt cholong int

Và cũng có thể khai báo a unsigned long(nó sẽ là a unsigned long int).

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


Đúng. unsignedgiống như unsigned intnhưng tôi đã tìm kiếm trên Dự thảo của Ủy ban WG14 / N1124 - Ngày 6 tháng 5 năm 2005 ISO / IEC 9899: TC2 cho unsignedvà không thể tìm thấy nơi được định nghĩa ... bạn có thể trích dẫn phần nơi nó được định nghĩa không?
user454322

5

Trong C và C ++

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

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

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

Các số nguyên có dấu được lưu trữ trong máy tính bằng phần bù của 2.


2

Theo C17 6.7.2 §2:

Mỗi danh sách các bộ xác định kiểu phải là một trong các bộ đa sau (được phân tách bằng dấu phẩy, khi có nhiều hơn một bộ đa cho mỗi mục); các chỉ định kiểu có thể xuất hiện theo bất kỳ thứ tự nào, có thể trộn lẫn với các chỉ định khai báo khác

- void
- char
- sign char
- unsigned char
- short, sign short, short int, or
unsigned int - unsigned short, hoặc unsigned short int
- int, đã ký, hoặc đã ký int
- unsigned, hoặc unsigned int
- long, sign dài , long int, hoặc int dài đã ký
- unsigned long, hoặc unsigned long int
- dài dài, dài đã ký dài, int dài dài, hoặc int dài đã ký
- unsigned long long, hoặc unsigned long long int
- float
- double
- long double
- _Bool
- float _Complex
- double _Complex
- dài kép _Complex
- mã định nghĩa loại nguyên tử
- struct hoặc union specifier
- enum specifier
- typedef name

Vì vậy, trong trường hợp unsigned intchúng ta có thể viết unsignedhoặc unsigned int, hoặc nếu chúng ta cảm thấy điên rồ int unsigned,. Cái sau vì tiêu chuẩn đủ ngu ngốc để cho phép "... có thể xảy ra theo bất kỳ thứ tự nào, có thể trộn lẫn". Đây là một lỗ hổng đã biết của ngôn ngữ.

Sử dụng mã C thích hợp unsigned int.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.