整型
#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;
}
sizeof
运算符可以返回变量或者变量类型的大小(单位:字节)由于
int
占据 4 个字节即 8 * 4 = 32 个 Bit,符号占有 Bit,所以INT_MIN = 2 ^ 31 * ( -1 )
INT_MAX = 2 ^ 31 - 1
printf
中的格式字符
格式字符 意义 d 以十进制形式输出带符号整数(正数不输出符号 10 o 以八进制形式输出无符号整数(不输出前缀 0) x 以十六进制形式输出无符号整数(不输出前缀 Ox) u 以十进制形式输出无符号整数 f 以小数形式输出单、双精度实数 e 以指数形式输出单、双精度实数 g 以%f 或%e 中较短的输出宽度输出单、双精度实数 c 输出单个字符 s 输出字符串 p 输出指针地址 lu 32 位无符号整数 llu 64 位无符号整数
字符型
#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 类型,容易出现精度损失