Rumah > pembangunan bahagian belakang > C++ > Adakah `char`, `signed char` dan `unsigned char` Benar-benar Berbeza dalam C ?

Adakah `char`, `signed char` dan `unsigned char` Benar-benar Berbeza dalam C ?

Linda Hamilton
Lepaskan: 2024-10-26 04:22:31
asal
602 orang telah melayarinya

  Are `char`, `signed char`, and `unsigned char` Truly Distinct in C  ?

Jenis Watak dalam C : Distinct or Equivalent?

Dalam C , tingkah laku jenis watak (char) kadangkala boleh berbeza daripada integer bertanda dan tidak bertanda, yang membawa kepada kekeliruan. Khususnya, kod berikut menunjukkan perbezaan ini:

<code class="cpp">#include <iostream>

typedef   signed char       int8;
typedef unsigned char      uint8;

struct TrueType {};
struct FalseType {};

template <typename T>
struct isX
{
   typedef typename T::ikIsX ikIsX;
};

template <>            struct isX<char  >  { typedef FalseType ikIsX; };
template <>            struct isX<int8  >  { typedef FalseType ikIsX; };
template <>            struct isX<uint8 >  { typedef FalseType ikIsX; };

template <typename T> bool getIsTrue();
template <>           bool getIsTrue<TrueType>() { return true; }
template <>           bool getIsTrue<FalseType>() { return false; }

int main(int, char **t )
{
   cout << getIsTrue< isX<char>::ikIsX  >() << endl;
   cout << getIsTrue< isX<int8>::ikIsX  >() << endl;
   cout << getIsTrue< isX<uint8>::ikIsX  >() << endl;
}</code>
Salin selepas log masuk

Kod ini menyusun tetapi menghasilkan hasil yang berbeza untuk char daripada untuk int8 dan uint8. Ini kerana C menganggap char, signed char dan unsigned char sebagai tiga jenis yang berbeza.

Sebaliknya, int dan uint32 ialah jenis yang setara:

<code class="cpp">template <>            struct isX<int   >  { typedef FalseType ikIsX; };
template <>            struct isX<unit32>  { typedef FalseType ikIsX; };</code>
Salin selepas log masuk

Perbezaan ini berpunca daripada fakta bahawa char secara sejarah telah digunakan untuk mewakili aksara dan menyimpan nilai angka. Akibatnya, C mengekalkan keserasian ke belakang dengan menganggap biasa char sebagai jenis yang berasingan, berbeza daripada int.

Untuk menentukan yang mana antara dua representasi yang digunakan char, char_traits typedef pelaksanaan::signed ialah disediakan. Jika ini benar, char berkelakuan sebagai jenis yang ditandatangani; jika tidak, ia berkelakuan sebagai jenis yang tidak ditandatangani.

Atas ialah kandungan terperinci Adakah `char`, `signed char` dan `unsigned char` Benar-benar Berbeza dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan