c语言基本出具类型的取值范围
2016-09-05 16:56
232 查看
1、C和C++语言中基本的数据类型有:字符型(char),整形(short, int, long), 浮点型(float, double)
[align=left]同时字符型和整形还可以继续分为带符号的和不带符号的,默认情况下都是带符号的,如果想使用不带符号的,则使用时带上 unsigned说明即可,如果是带符号的,那么最高位将表示符号位,最高位为0表示为正数,最高位为1表示为负数,因此根据这个可以得到不同类型在分别带符号和不带符号的情况下表示的数据范围:[/align]
[align=left] [/align]
[align=left]2、对于字符型和整形特别需要注意其表示的范围,如果运算导致超出其范围的处理,如以下的代码:[/align]
int main()
{
signed char ch = 127;
ch += 1;
printf("%d\n", ch);
return 0;
}
[align=left]输出结果为:-128,注意,定义ch时赋予的值为127,已经是char能表示的最大数,其最终结果-128的来历是这样的:[/align]
[align=left]第一步:首先127在计算机中用二进制表示为:01111111;[/align]
[align=left]第二步:01111111 + 00000001 = 10000000;[/align]
[align=left]第三步:由于ch是带符号的,当最高位为1时,表示是负数,而负数的计算机中是利用补码来存储的,回忆计算负数补码的方法(首先取负数的绝对值,然后求二进制,对二进制取反,在对取反后的值加1,即为负数的补码);[/align]
[align=left]第四步:于是根据求补码的反步骤,我们来求最原始的负数,由于本题中补码为10000000,首先10000000 - 00000001 = 01111111,然后对01111111取反为10000000,10000000 = 128,由于本身是负数,即ch为-128.[/align]
[align=left] [/align]
[align=left]再看以下一段代码:[/align]
int main()
{
unsigned char ch = 255;
ch += 1;
printf("%d\n", ch);
return 0;
}
[align=left]输出结果为:0;[/align]
[align=l
4000
eft]其分析为:首先ch = 255提升为整形,在计算机的存储为:(000....)11111111,然后(000....)11111111+1 = (000...)0001 00000000;然后再将最后的八位二进制截取给ch,由于最后八位全是0,因此ch = 0了。[/align]
[align=left]同理:对于遇到整形int short, long等出现上述情况时,我们也可以这样分析得到结果。[/align]
类型 | 字节数 | 类型 | 字节数 |
char | 1 | short | 2 |
int | 根据系统而定,可能是2或4 | long | 4 |
float | 4 | double | 8 |
类型 | 范围 | 类型 | 范围 |
(signed)char | -128——127 | unsigned char | 0——255 |
(signed) short | -32768——32767 | unsigned short | 0——65535 |
(signed ) int | -32768——32767 | unsigned short | 0——65535 |
(signed) long | -2147483648——2147483647 | unsigend long | 0——4294967295 |
float | -3.4*10-38——3.4*1038 | double | -1.7*10-308——1.7*10308 |
[align=left]2、对于字符型和整形特别需要注意其表示的范围,如果运算导致超出其范围的处理,如以下的代码:[/align]
int main()
{
signed char ch = 127;
ch += 1;
printf("%d\n", ch);
return 0;
}
[align=left]输出结果为:-128,注意,定义ch时赋予的值为127,已经是char能表示的最大数,其最终结果-128的来历是这样的:[/align]
[align=left]第一步:首先127在计算机中用二进制表示为:01111111;[/align]
[align=left]第二步:01111111 + 00000001 = 10000000;[/align]
[align=left]第三步:由于ch是带符号的,当最高位为1时,表示是负数,而负数的计算机中是利用补码来存储的,回忆计算负数补码的方法(首先取负数的绝对值,然后求二进制,对二进制取反,在对取反后的值加1,即为负数的补码);[/align]
[align=left]第四步:于是根据求补码的反步骤,我们来求最原始的负数,由于本题中补码为10000000,首先10000000 - 00000001 = 01111111,然后对01111111取反为10000000,10000000 = 128,由于本身是负数,即ch为-128.[/align]
[align=left] [/align]
[align=left]再看以下一段代码:[/align]
int main()
{
unsigned char ch = 255;
ch += 1;
printf("%d\n", ch);
return 0;
}
[align=left]输出结果为:0;[/align]
[align=l
4000
eft]其分析为:首先ch = 255提升为整形,在计算机的存储为:(000....)11111111,然后(000....)11111111+1 = (000...)0001 00000000;然后再将最后的八位二进制截取给ch,由于最后八位全是0,因此ch = 0了。[/align]
[align=left]同理:对于遇到整形int short, long等出现上述情况时,我们也可以这样分析得到结果。[/align]
相关文章推荐
- 编译器定义的C/C++语言各种基本数据类型的取值范围
- 编译器定义的C/C++语言各种基本数据类型的取值范围
- 编译器定义的C/C++语言各种基本数据类型的取值范围用程序输出
- 编译器定义的C/C++语言各种基本数据类型的取值范围
- [C/C++]C++下基本类型所占位数和取值范围
- java基本类型取值范围及相关类型转换
- C++下基本数据类型所占位数和取值范围
- C语言数据类型取值范围解析
- java基本类型取值范围及相关类型转换
- java基本类型byte的取值范围
- 基本的数据类型和取值范围
- 【C语言程序设计】编程确定不同数据类型的取值范围
- C++下基本类型所占位数和取值范围
- C++下基本数据类型所占位数和取值范围
- java基本数据类型和取值范围
- java基本类型byte的取值范围
- 查看JAVA中各基本类型的取值范围
- C++下基本数据类型所占位数和取值范围
- C++中基本数据类型字节数及取值范围
- [C/C++]C++下基本类型所占位数和取值范围