skip to content

C
C 数据类型

整型

#include <limits.h>
#include <math.h>
#include <stdio.h>

int main( int argc, char* argv[] ) {
  /* 有符号整形 */
  short     si = 0;
  int       i  = 0;
  long      li = 0;
  long long ll = 0;
  /* 无符号整形 */
  unsigned short     usi = 0;
  unsigned int       ui  = 0;
  unsigned long      uli = 0;
  unsigned long long ull = 0;
  printf( "short               长度 : %d\n", sizeof( short ) );               // 2
  printf( "int                 长度 : %d\n", sizeof( int ) );                 // 4
  printf( "long                长度 : %d\n", sizeof( long ) );                // 4
  printf( "long long           长度 : %d\n", sizeof( long long ) );           // 8
  printf( "unsigned short      长度 : %d\n", sizeof( unsigned short ) );      // 2
  printf( "unsigned int        长度 : %d\n", sizeof( unsigned int ) );        // 4
  printf( "unsigned long       长度 : %d\n", sizeof( unsigned long ) );       // 4
  printf( "unsigned long long  长度 : %d\n", sizeof( unsigned long long ) );  // 8
  printf( "int                 范围 : %d => %d\n", INT_MIN, INT_MAX );        // -2147483648 => 2147483647
  printf( "unsigned int        范围 : %d => %u\n", 0, UINT_MAX );             // 0 => 4294967295
  return 0;
}
  1. sizeof 运算符可以返回变量或者变量类型的大小(单位:字节)

  2. 由于 int 占据 4 个字节即 8 * 4 = 32 个 Bit,符号占有 Bit,所以

    INT_MIN = 2 ^ 31 * ( -1 )

    INT_MAX = 2 ^ 31 - 1

  3. printf 中的格式字符

    格式字符意义
    d以十进制形式输出带符号整数(正数不输出符号 10
    o以八进制形式输出无符号整数(不输出前缀 0)
    x以十六进制形式输出无符号整数(不输出前缀 Ox)
    u以十进制形式输出无符号整数
    f以小数形式输出单、双精度实数
    e以指数形式输出单、双精度实数
    g以%f 或%e 中较短的输出宽度输出单、双精度实数
    c输出单个字符
    s输出字符串
    p输出指针地址
    lu32 位无符号整数
    llu64 位无符号整数

字符型

#include <limits.h>
#include <stdio.h>

int main( int argc, char* argv[] ) {
  char char_a = 'a';
  int  int_a  = 97;
  printf( "char 长度 : %d\n", sizeof( char ) );    /* 1 */
  printf( "int  长度 : %d\n", sizeof( int ) );     /* 4 */
  printf( "使用 %%d 格式化 char : %d\n", char_a ); /* 97 */
  printf( "使用 %%c 格式化 char : %c\n", char_a ); /* a */
  printf( "使用 %%d 格式化 int  : %d\n", int_a );  /* 97 */
  printf( "使用 %%c 格式化 int  : %c\n", int_a );  /* a */
}

其实呢,这部分能看出 char 和 int 只是从不同角度观察了同一个东西

我们可以从 JS 的角度来看一下

String.fromCharCode(97) // 'a'
'a'.charCodeAt() // 97

不过 JS 中并没有 char 这个概念,97 与 'a' 的相等也就更无从提及了

xdm 注意了啊,下面分别用各种方式定义的量竟然都是一样的

#include <stdio.h>

int main( int argc, char* argv[] ) {
  /* 首先派出 char 代表队 */
  char char_a     = 'a';
  char char_a_oct = '\141';
  char char_a_hex = '\x61';
  /* 接下来有请 int 代表队 */
  int int_a     = 97;
  int int_a_oct = 0141;
  int int_a_hex = 0x61;
  /* 然后打印康康 */
  printf( "使用 %%c 格式化\n" );
  printf( "char_a     : %c\n", char_a );     /* a */
  printf( "char_a_oct : %c\n", char_a_oct ); /* a */
  printf( "char_a_hex : %c\n", char_a_hex ); /* a */
  printf( "int_a      : %c\n", int_a );      /* a */
  printf( "int_a_oct  : %c\n", int_a_oct );  /* a */
  printf( "int_a_hex  : %c\n", int_a_hex );  /* a */
  printf( "使用 %%d 格式化\n" );
  printf( "char_a     : %d\n", char_a );     /* 97 */
  printf( "char_a_oct : %d\n", char_a_oct ); /* 97 */
  printf( "char_a_hex : %d\n", char_a_hex ); /* 97 */
  printf( "int_a      : %d\n", int_a );      /* 97 */
  printf( "int_a_oct  : %d\n", int_a_oct );  /* 97 */
  printf( "int_a_hex  : %d\n", int_a_hex );  /* 97 */
  printf( "使用 %%o 格式化\n" );
  printf( "char_a     : %o\n", char_a );     /* 141 */
  printf( "char_a_oct : %o\n", char_a_oct ); /* 141 */
  printf( "char_a_hex : %o\n", char_a_hex ); /* 141 */
  printf( "int_a      : %o\n", int_a );      /* 141 */
  printf( "int_a_oct  : %o\n", int_a_oct );  /* 141 */
  printf( "int_a_hex  : %o\n", int_a_hex );  /* 141 */
  printf( "使用 %%x 格式化\n" );
  printf( "char_a     : %x\n", char_a );     /* 61 */
  printf( "char_a_oct : %x\n", char_a_oct ); /* 61 */
  printf( "char_a_hex : %x\n", char_a_hex ); /* 61 */
  printf( "int_a      : %x\n", int_a );      /* 61 */
  printf( "int_a_oct  : %x\n", int_a_oct );  /* 61 */
  printf( "int_a_hex  : %x\n", int_a_hex );  /* 61 */
  return 0;
}

从上面的实验可以看出:

你可以用不同的方式来表示一个 int 或者 char( 字符、8 进制字符、16 进制字符、整形、8 进制整形、16 进制的整形 )

你也可以用不同的方式来展示一个 int 或者 char (%d、%c、%o、%x)

这里有个小问题:在 1 个 char 的大小是 1 个字节( 8 个 Bit ),所以最多也就是能表示 256(2 ^ 8)种字符, 那么像单个汉字要或者其他的语言文字要怎么表示呢?

这里就需要引入 Unicode 字符集了

int main( int argc, char* argv[] ) {
  /* C95 开始支持 Unicode*/
  wchar_t qi = L'七';
  printf( "wchar_t 长度 : %d\n", sizeof( wchar_t ) ); /* 2 */
  return 0;
}

TODO : 打印宽字符

浮点型

#include <float.h>
#include <limits.h>
#include <stdio.h>

int main( int argc, char* argv[] ) {
  float       f  = 3.14f;
  double      d  = 3.14;
  long double ld = 3.14;
  printf( "float       长度 : %d\n", sizeof( float ) );        /* 4 */
  printf( "double      长度 : %d\n", sizeof( double ) );       /* 8 */
  printf( "long double 长度 : %d\n", sizeof( long double ) );  /* 16 */
  printf( "float       范围 : %e => %e\n", FLT_MIN, FLT_MAX ); /* 1.175494e-038 => 3.402823e+038 */
  printf( "double      范围 : %e => %e\n", DBL_MIN, DBL_MAX ); /* 2.225074e-308 => 1.797693e+308 */
  printf( "float       精度 : %d\n", FLT_DIG );                /* 6 */
  printf( "double      精度 : %d\n", DBL_DIG );                /* 15 */
  return 0;
}

注意:表示金钱的时候,不要用 float 类型,容易出现精度损失