基本数据类型的取值范围&强制转换&内存存储
c语言基本数据类型如下,以下讨论,是基于64bit平台而言:
【a】数据类型 长度 取值范围 内存存储
1、signed int 4字节 -2147483648 ~ 2147483647 1bit符号位 + 31bit数字位
2、unsigned int 4字节 0 ~ 4294967295 32bit数字位
3、signed char 1字节 -128 ~ 127 1bit符号位 + 7bit数字位
4、unsigned char 1字节 0 ~ 255 8bit数字位
5、signed short 2字节 -32768 ~ 32767 1bit符号位 + 15bit数字位
6、unsigned short 2字节 0 ~ 65535 16bit数字位
7、signed long 8字节 -9223372036854775808 ~ 9223372036854775807 1bit符号位 + 63bit数字位
8、unsigned long 8字节 0 ~ 18446744073709551615 64bit数字位
【a1】:正负数:前提是:计算机中是以补码的形式存储数据的
以signed char举例:
直观的来看,从数据类型的1bit符号位 + 7bit数值位 分析如下:
原码: 0 111 1111 ~ 0 000 0000 ~ 1 000 0000 ~ 1 111 1111
数值: 127 ~ +0 ~ -0 ~ -127
补码: 0 111 1111 ~ 0 000 0000 ~ 0 000 0000 ~ 1 000 0001,从左侧补码取值范围可以看到,补码的1 000 0000没有用到,因此人为规定1 000 0000表示负数-128
编程可以看到,在内存中的数据存储,确是补码形式
【a2】:强制转换<类型长度一致时>:前提是:内存数据不变,只是将内存中的数据从typeA识别为typeB
如:int i = -1;
unsigned int j = i;
则,打印显示,j的值为65535
同理:unsigned int i = 1;
int j = i;
则,打印显示,j的值为1
【a3】:强制转换<类型长度不一致时>:
源类型 目标类型
<1> 短型有符号 转 长型有符号
正数 -> 高位补0
负数 -> 符号位为1,高位补1
<2> 短型无符号 转 长型无符号
正数 -> 高位补0
<3> 短型有符号 转 长型无符号
不允许,属错误用法,结果可能随编译器而改变
<4> 短型无符号 转 长型有符号
正数 -> 高位补0
<5> 长型有符号 转 短型有符号
需考虑截断风险
一旦截断,结果可能随编译器而改变
<6> 长型无符号 转 短型无符号
需考虑截断风险
一旦截断,结果可能随编译器而改变
<7> 长型有符号 转 短型无符号
需考虑截断风险
一旦截断,结果可能随编译器而改变
<8> 长型无符号 转 短型有符号
需考虑截断风险
一旦截断,结果可能随编译器而改变
如:char c =128;
int i = c;
printf("uc to ui:%d %u to %d %u\n", c, c, i, i);
结果:-128 4294967168(0xFFFF FF80) to -128 4394967168(0xFFFF FF80)
即: 128作为char类型打印,超出了char的取值范围,<内存中是1 000 0000>,被识别为char型的-128。则实际%u类型打印,是先自动扩展为4字节有符号类型(1 111 1111 1111 1111 1111 1111 1000 0000),再转换为无符号类型%u打印
【b】数据类型 长度 取值范围 内存存储
9、float 4字节 -2^128 ~ 2^128 1bit符号位 + 8bit指数位 + 23bit数值位
10、double 8字节 -2^1024 ~ 2^1024 1bit符号位 + 11bit指数位 + 52bit数值位
【c】隐式转换

浙公网安备 33010602011771号