目的
c 语言,确定本机的
-
int 类型的取值范围
-
char 类型的取值范围
先确定占用字节数 n,则
-
有符号数范围为 [-28n-1, 28n-1 - 1](补码表示)
-
无符号数范围为 [0, 28n - 1]
不同后缀表示的含义:
100L long
100UL unsinged long
100.0 double
100.0F float
100.0L long double
可以按 n = 1、2、4、8 尝试,算出范围最大值,再加一,观察是否溢出(变为 0 或负数)。整数型字面量最大值为 9223372036854775807(263-1)。或者调用如 sizeof(long long) 求 long long 占用字节数。
使用 %d 输出整数,只能输出后 32 位。
long long i = 9223372036854775806;
printf("%d", i);
C:\Users\lww\Desktop\c>a
-2
9223372036854775806 % 2^32 = 4294967294,超出 [0,2147483647]
输出值:4294967294 - 2^32 = -2
所以下面的方法不太适用,不容易观察超过 8 字节类型的范围,可以使用 %lld 代替。
int i = 0;
while (i >= 0) {
i++;
}
printf("%d\n", i);
printf("%d\n", i-1);
C:\Users\lww\Desktop\c>a
-2147483648
2147483647
int 类型取值范围:[-2147483648, 2147483647],一共 4294967296 个值,占用 4 个字节。
- unsigned int 类型取值范围:[0, 4294967295]。
short int 类型取值范围:[-32768, 32767],一共 65536 个值,占用 2 个字节。
- unsigned short int 类型取值范围:[0, 65535]。
long int 类型取值范围:[-2147483648, 2147483647],占用 4 个字节。
- unsigned long int 类型取值范围:[0, 4294967295]。
long long int 取值范围:[-9223372036854775808, 9223372036854775807],占用 8 个字节。
- unsigned long long int 类型取值范围:[0, 18446744073709551615]。
char 取值范围:[0, 255],占用 1 个字节。
- signed char 取值范围:[-128, 127]。
对于 char 而言,存入一个汉字,观察字符数组长度(不包括 ‘\0’)。
#include <stdio.h>
#include <string.h>
int main() {
char c[] = "果";
int leng = strlen(c);
printf("数组长度:%d\n", leng);
for (int i = 0; i < leng; i++) {
printf("%d ", c[i]);
}
return 0;
}
C:\Users\lww\Desktop\c>a
数组长度:2
-71 -5
长度为 2,一共占用 2 个字节,怀疑是 UTF-16 或 GBK 编码。
-71 的补码:10111001(0xB9)
-5 的补码:11111011(0xFB)
可以确定这是 GBK 编码,在 25 区的第 91 个数。
float 占用 4 个字节,有效数字 8 位。
double 占用 8 个字节,有效数字 16 位。
不支持 long double 类型。
浮点数最大正值、最小正值:
float min_float = 0x1P-149;
float max_float = 0x1.fffffeP127;
double min_double = 0x1P-1074;
double max_double = 0x1.fffffffffffffP1023;
printf("%.50f\n\n", min_float);
printf("%.1f\n\n", max_float);
printf("%.330f\n\n", min_double);
printf("%.1f\n\n", max_double);
换成科学计数法表示(%e):
1.401298e-045
3.402823e+038
4.940656e-324
1.797693e+308
浮点数特殊值:
可以计算表达式 1.0/0.0、-1.0/0.0、0.0/0.0 得到:
1.#INF00 正无穷
-1.#INF00 负无穷
-1.#IND00 不是数字