apa tipe data unsigned?

90

Saya telah melihat unsignedtipe "tanpa tipe" ini digunakan beberapa kali, tetapi tidak pernah melihat penjelasan untuk itu. Saya kira ada signedtipe yang sesuai . Berikut contohnya:

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;
}

Apa yang telah saya kumpulkan sejauh ini:
- di sistem saya, sizeof(unsigned) = 4(mengisyaratkan int 32-bit unsigned)
- ini dapat digunakan sebagai singkatan untuk mentransmisikan jenis lain ke versi unsigned:

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

Apakah ANSI C ini, atau hanya ekstensi kompilator?

hhaamu
sumber

Jawaban:

144

unsignedbenar-benar singkatan dari unsigned int, dan didefinisikan dalam standar C.

Martin v. Löwis
sumber
30

unsignedartinya unsigned int. signedartinya signed int. Menggunakan just unsignedadalah cara yang malas untuk mendeklarasikan sebuah unsigned intin C. Ya, ini ANSI.

Polaris878
sumber
14

Secara historis di C, jika Anda menghilangkan tipe data "int" diasumsikan. Jadi "unsigned" adalah singkatan dari "unsigned int". Ini telah dianggap sebagai praktik yang buruk sejak lama, tetapi masih ada cukup banyak kode di luar sana yang menggunakannya.


sumber
6
Saya tidak menyadari bahwa itu adalah praktik yang buruk. Apakah ada alasan untuk ini? longbukannya long intsangat umum jadi saya tidak yakin mengapa unsignedbukannya unsigned inttidak bisa diterima.
CB Bailey
10
@Charles Bailey: hari-hari ini - setidaknya jika Anda bersikap pragmatis daripada formal - panjang, int, pendek, dan karakter dianggap sebagai tipe data yang berbeda karena ukurannya dapat berbeda) dengan unsigned (dan defaultnya, ditandatangani) menjadi a kualifikasi. Jadi, Anda cenderung menggunakan "unsigned int" dengan cara yang sama seperti Anda menggunakan "unsigned long" atau "unsigned char" (dan ini menjelaskan bahwa Anda tidak melewatkan intnya). Int dalam "long int" atau "short int" tidak berguna.
Dipstick
1
@Dipstick, "long" adalah kualifikasi untuk "int". Sepertinya int di "unsigned int" sama berlebihannya dengan int di "unsigned long int."
Conrad Meyer
1
Ini tidak sama dengan aturan implisit "int". Jawaban ini menyesatkan.
7

di C, unsignedadalah jalan pintas untuk unsigned int.

Anda memiliki yang sama untuk longitu adalah jalan pintas untuklong int

Dan juga mungkin untuk mendeklarasikan a unsigned long(itu akan menjadi a unsigned long int).

Ini ada dalam standar ANSI

ThibThib
sumber
Iya. unsignedsama seperti unsigned inttetapi saya melakukan pencarian di WG14 / N1124 Committee Draft - 6 Mei 2005 ISO / IEC 9899: TC2 untuk unsigneddan tidak dapat menemukan di mana didefinisikan ... dapatkah Anda mengutip bagian yang didefinisikan?
pengguna454322
5

Di C dan C ++

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

Integer unsigned yang berisi n bit dapat memiliki nilai antara 0 dan (2 ^ n-1), yaitu 2 ^ n nilai yang berbeda.

Integer unsigned bisa positif atau nol.

Integer yang ditandatangani disimpan di komputer menggunakan komplemen 2.

Rabin Sah
sumber
2

Menurut C17 6.7.2 §2:

Setiap daftar penentu tipe harus menjadi salah satu dari multiset berikut (dipisahkan dengan koma, jika ada lebih dari satu multiset per item); penentu tipe dapat muncul dalam urutan apapun, mungkin bercampur dengan penentu deklarasi lainnya

- void
- char
- signed char
- unsigned char
- short, signed short, short int, atau signed short int
- unsigned short, atau unsigned short int
- int, signed, atau signed int
- unsigned, atau unsigned int
- long, signed long , long int, atau signed long int
- unsigned long, atau unsigned long int
- long long, signed long long, long long int, atau signed long long int
- unsigned long, atau unsigned long long int
- float
- double
- long double
- _Bool
- float _Complex
- double _Complex
- panjang ganda _Complex - struct atau union specifier - enum specifier
- jenis atom


- nama typedef

Jadi jika unsigned intkita bisa menulis unsignedatau unsigned int, atau jika kita merasa gila , int unsigned. Yang terakhir karena standar cukup bodoh untuk memungkinkan "... dapat terjadi dalam urutan apapun, mungkin tercampur". Ini adalah kesalahan bahasa yang diketahui.

Penggunaan kode C yang tepat unsigned int.

Lundin
sumber
1

Membawa jawaban saya dari pertanyaan lain .

Dari spesifikasi C , bagian 6.7.2:

- unsigned, atau unsigned int

Artinya unsigned, bila tidak ditentukan jenisnya, harus default unsigned int. Jadi menulis unsigned aitu sama dengan unsigned int a.

Bruno Ferreira
sumber