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.c
mengeluarkan 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 functions
dan tidak bisa memahami specifier format yang benar saat menggunakan pengubah panjang (seperti short
, long
, dll) dengan unsigned
untuk int
tipe data.
Apakah %u
penentu yang benar unsigned short int
? Jika demikian, mengapa saya mendapatkan peringatan yang disebutkan di atas ?!
EDIT: Sebagian besar waktu, saya mencoba %uh
dan masih memberikan peringatan.
printf("%u\n", (unsigned int)length); //
selalu berfungsi, karena spesifikasi C99 yang Anda baca menjamin bahwasizeof(short) <= sizeof(int)
(tetapi jawaban sebenarnya untuk pertanyaan di bawah ini tentu saja jauh lebih baik)Jawaban:
Coba gunakan
"%h"
pengubah:sumber
Karena
scanf
, Anda perlu menggunakan%hu
karena Anda meneruskan pointer ke fileunsigned short
. Karenaprintf
, tidak mungkin untuk lulusunsigned short
karena promosi default (itu akan dipromosikan keint
atauunsigned int
tergantung pada apakahint
memiliki setidaknya banyak bit nilaiunsigned short
atau tidak) begitu%d
atau%u
baik-baik saja. Anda bebas menggunakan%hu
jika Anda mau.sumber
Dari halaman manual Linux:
Jadi untuk mencetak bilangan bulat pendek unsigned, format string harus
"%hu"
.sumber
Berikut adalah tabel yang bagus untuk
printf
penentu. Jadi seharusnya%hu
untukunsigned short int
.Dan link ke Wikipedia "tipe data C" juga.
sumber