c 各种类型的范围

目的

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 不是数字
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值