基本数据类型的取值范围&强制转换&内存存储

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】隐式转换

posted @ 2018-12-01 21:42  thinking......  阅读(819)  评论(0)    收藏  举报