Apa penentu format untuk unsigned short int?

124

Saya memiliki program berikut

#include <stdio.h>

int main(void)
{
    unsigned short int length = 10; 

    printf("Enter length : ");
    scanf("%u", &length);

    printf("value is %u \n", length);

    return 0;
}

Yang ketika disusun menggunakan gcc filename.cmengeluarkan peringatan berikut (di scanf()baris).

warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat]

Saya kemudian merujuk C99 specification - 7.19.6 Formatted input/output functionsdan tidak bisa memahami specifier format yang benar saat menggunakan pengubah panjang (seperti short, long, dll) dengan unsigneduntuk inttipe data.

Apakah %upenentu yang benar unsigned short int? Jika demikian, mengapa saya mendapatkan peringatan yang disebutkan di atas ?!

EDIT: Sebagian besar waktu, saya mencoba %uhdan masih memberikan peringatan.

Sangeeth Saravanaraj
sumber
2
printf("%u\n", (unsigned int)length); //selalu berfungsi, karena spesifikasi C99 yang Anda baca menjamin bahwa sizeof(short) <= sizeof(int)(tetapi jawaban sebenarnya untuk pertanyaan di bawah ini tentu saja jauh lebih baik)
Philip
1
Tidak perlu pemeran; promosi default menanganinya.
R .. GitHub STOP HELPING ICE

Jawaban:

155

Coba gunakan "%h"pengubah:

scanf("%hu", &length);
        ^

ISO / IEC 9899: 201x - 7.21.6.1-7

Menentukan bahwa penentu konversi berikut d, i, o, u, x, X, atau n berlaku untuk argumen dengan penunjuk tipe ke short atau unsigned short .

cnicutar
sumber
47

Karena scanf, Anda perlu menggunakan %hukarena Anda meneruskan pointer ke file unsigned short. Karena printf, tidak mungkin untuk lulus unsigned shortkarena promosi default (itu akan dipromosikan ke intatau unsigned inttergantung pada apakah intmemiliki setidaknya banyak bit nilai unsigned shortatau tidak) begitu %datau %ubaik-baik saja. Anda bebas menggunakan %hujika Anda mau.

R .. GitHub BERHENTI ICE BANTUAN
sumber
7

Dari halaman manual Linux:

h Sebuah konversi integer berikut sesuai dengan int pendek atau argumen int pendek unsigned, atau berikut
       menurunkan n konversi sesuai dengan pointer ke argumen int pendek.

Jadi untuk mencetak bilangan bulat pendek unsigned, format string harus "%hu".

Beberapa orang programmer
sumber
Saya tidak berpikir begitulah cara Anda "printf" short int karena mereka secara otomatis dipromosikan menjadi int (seperti karakter).
Alexey Frunze
2
@Alex% hu /% hd di printf berfungsi. % Hhu /% hhd yang hanya tersedia mulai dengan C99. % h dan% hh menyiratkan a & 0xFFFF resp. & 0xFF pada bilangan bulat yang diteruskan.
jørgensen