C语⾔数据类型的表⽰范围
1、C和C++语⾔中基本的数据类型有:字符型(char),整形(short, int, long), 浮点型(float, double)
类型字节数类型字节数
char1short2
int根据系统⽽定,可能是2或4long4
float数值范围float4double8
同时字符型和整形还可以继续分为带符号的和不带符号的,默认情况下都是带符号的,如果想使⽤不带符号的,则使⽤时带上 unsigned说明即可,如果是带符号的,那么最⾼位将表⽰符号位,最⾼位为0表⽰为正数,最⾼位为1表⽰为负数,因此根据这个可以得到不同类型在分别带符号和不带符号的情况下表⽰的数据范围:
类型范围类型范围
(signed)char-128——127unsigned char0——255
(signed) short-32768——32767unsigned short0——65535
(signed ) int-32768——32767
-2147483648——
2147483647unsigned int0——65535
0——4294967295
(signed) long-
2147483648——2147483647
unsigend long0——4294967295
float-3.4*10-38——3.4*1038double-1.7*10-
308——1.7*10308
2、对于字符型和整形特别需要注意其表⽰的范围,如果运算导致超出其范围的处理,如以下的代码:
1. int main()
2. {
3.    signed char ch = 127;
4.    ch += 1;
5.    printf("%d\n", ch);
6.
7.    return 0;
8. }
输出结果为:-128,注意,定义ch时赋予的值为127,已经是char能表⽰的最⼤数,其最终结果-128的来历是这样的:
第⼀步:⾸先127在计算机中⽤⼆进制表⽰为:01111111;
第⼆步:01111111 + 00000001 = 10000000;
第三步:由于ch是带符号的,当最⾼位为1时,表⽰是负数,⽽负数的计算机中是利⽤补码来存储的,回忆计算负数补码的⽅法(⾸先取负数的绝对值,然后求⼆进制,对⼆进制取反,在对取反后的值加1,即为负数的补码);
第四步:于是根据求补码的反步骤,我们来求最原始的负数,由于本题中补码为10000000,⾸先10000000 - 00000001 = 01111111,然后对01111111取反为10000000,10000000 = 128,由于本⾝是负数,即ch为-128.
再看以下⼀段代码:
1. int main()
2. {
3.    unsigned char ch = 255;
4.    ch += 1;
5.    printf("%d\n", ch);
6.
7.    return 0;
8. }
输出结果为:0;
其分析为:⾸先ch = 255提升为整形,在计算机的存储为:()11111111,然后()11111111+1 = ()0001 00000000;然后再将最后的⼋位⼆进制截取给ch,由于最后⼋位全是0,因此ch = 0了。
同理:对于遇到整形int short, long等出现上述情况时,我们也可以这样分析得到结果。