Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
Linda Hamiltonasal
2024-10-26 04:22:31421semak imbas

  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>

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>

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:
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