Từ khóa không dấu trong C ++


87

Từ khóa unsigned có mặc định cho một kiểu dữ liệu cụ thể trong C ++ không? Tôi đang cố gắng viết một hàm cho một lớp cho nguyên mẫu:

unsigned Rotate(unsigned object, int count)

Nhưng tôi không thực sự hiểu những gì unsignedcó nghĩa là. Nó không nên giống như unsigned inthay gì đó?

Câu trả lời:


92

Từ liên kết trên:

Một số loại này có thể được sửa đổi bằng cách sử dụng các từ khóa có dấu, không dấu, ngắn và dài. Khi một trong các công cụ sửa đổi kiểu này được sử dụng bởi chính nó, một kiểu dữ liệu là int được giả định

Điều này có nghĩa là bạn có thể cho rằng tác giả đang sử dụng int.


C99 và MISRA có được phép làm như vậy không?
nowox

42

Các loại số nguyên:

short            -> signed short
signed short
unsigned short
int              -> signed int
signed int
unsigned int
signed           -> signed int
unsigned         -> unsigned int
long             -> signed long
signed long
unsigned long

Hãy cẩn thận với char:

char  (is signed or unsigned depending on the implmentation)
signed char
unsigned char

1
@Firas: Tôi biết nó là trong C .Implicit int không phải là một phần của tiêu chuẩn ISO C99 cũng không phải là một phần của tiêu chuẩn ISO C ++
Prasoon Saurav

4
Sử dụng 'unsigned' (tự nó) để khai báo kiểu 'unsigned int' là tiêu chuẩn trong C ++. Trong tiêu chuẩn hiện tại: 7.1.5.2 [dcl.simple.type] có một bảng xác định từng khai báo kiểu thành kiểu thực được sử dụng. Bảng đó có sự tương ứng từ khai báo 'unsigned' đến kiểu 'unsigned int'.
David Rodríguez - dribeas

2
Lưu ý rằng char có hành vi giống hệt với char có dấu hoặc không dấu, nhưng vẫn là một loại riêng biệt cho dù thế nào đi nữa.

@Firas: Xem Phần: 3.9.1 Các loại cơ bản. Paragrah 2: <quote> Có năm kiểu số nguyên có dấu tiêu chuẩn: “ký tự ký hiệu”, “số nguyên ngắn”, “số nguyên”, “số nguyên dài” và “số nguyên dài”. </quote>
Martin York

21

Từ khóa unsigned có mặc định là kiểu dữ liệu trong C ++ không

Có, có chữ ký và không dấu cũng có thể được sử dụng làm bộ chỉ định loại độc lập

Các kiểu dữ liệu số nguyên char, short, long và int có thể có dấu hoặc không dấu tùy thuộc vào phạm vi số cần được biểu diễn. Các loại có dấu có thể đại diện cho cả giá trị dương và âm, trong khi các loại không dấu chỉ có thể đại diện cho các giá trị dương (và không).

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).

Tuy nhiên, có dấu và không dấu cũng có thể được sử dụng làm mã định danh kiểu độc lập, có nghĩa là tương tự như int có dấu và int không dấu tương ứng. Hai khai báo sau là tương đương:

unsigned NextYear;
unsigned int NextYear;

3
Vậy đó không phải là "có" sao? Nó mặc định là int, nếu được sử dụng mà không có kiểu?
thư giãn

Cảm ơn bạn! Tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi và tôi cảm thấy bối rối với ý nghĩa của kiểu dữ liệu không dấu. Chữ ký của ai? Nó không bao giờ xảy ra với tôi rằng nó có thể là từ các dấu hiệu danh ...: D
user74200

Các từ khóa shortlongcũng là các từ bổ nghĩa loại . Nếu bạn viết short s, điều đó thực sự có nghĩa short int s, giống như unsigned uthực sự có nghĩa unsigned int u. (và unsigned shortphương tiện unsigned short int)
Ben Voigt

8

Bạn có thể đọc về từ khóa unsigned trong Tài liệu tham khảo C ++ .

Có hai loại khác nhau trong vấn đề này, đã ký và chưa ký. Mặc định cho các số nguyên là có dấu có nghĩa là chúng có thể có giá trị âm.

Trên hệ thống 32 bit, một số nguyên là 32 Bit có nghĩa là nó có thể chứa giá trị ~ 4 tỷ.

Và khi nó đã được ký kết, điều này có nghĩa là bạn cần phải chia nó ra, để lại -2 tỷ đến +2 tỷ.

Tuy nhiên, khi nó không có dấu, giá trị không được chứa bất kỳ số âm nào, vì vậy đối với số nguyên, điều này có nghĩa là 0 đến +4 tỷ.

Có thêm một chút thông tin về điều này trên Wikipedia .


2
Tôi thích tự mình hát cho hầu hết mọi thứ. Carbon và carmelization ngon tuyệt!
Omnifarious

1
Còn sửa lỗi chính tả thì sao? ... đó là những gì mà nút "chỉnh sửa" ở đó!
Filip Ekberg

3

Vâng, nó có nghĩa là unsigned int. Trước đây, nếu bạn không chỉ định kiểu dữ liệu trong C thì có nhiều chỗ nó chỉ giả định int. Ví dụ, đây là thử các kiểu trả về của hàm.

Mụn cóc này gần như đã được diệt trừ, nhưng bạn đang bắt gặp dấu tích cuối cùng của nó ở đây. IMHO, mã phải được sửa lại unsigned intđể tránh chỉ là loại nhầm lẫn mà bạn đang gặp phải.

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.