c language data knowlege

来源:互联网 发布:杭州数据资源管理局 编辑:程序博客网 时间:2024/05/22 20:27
1、根据char的取值范围和unsigned char的取值范围的位数,如char和unsigned char都是8位,char型最高位是符号位,1代表为负数,所以为-2^7-1~~+2^7-1 即 [-128, 127] ,而unsigned char为2^8-1=256 即0~255。如,2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0=2^8-1, 取值范围由等比数列求出。
2、从一个小数转换为一个大数,比如 short ——>int,需要做高位的扩展。目前所知,有符号位扩展,和zero扩展两钟。符号位扩展即是把高位段全部赋值为小数的最高位数,比如0xC0转换为0xFFFFFFC0,而 0x70,转换后为0x00000070.  zero扩展即是把高位段都赋值为0。据我了解,对于signed类型的转换,用的是符号位扩展,而对于unsigned类型的转换,所用的是zero扩展。其目的是保留了转换之前的真值大小。计算机的数值编码都以补码表示。
3、9与-9
9的源码为00001001,
-9,补码为最高位置1 ,其余取反也就是11110110,然后在最低位加1即可即11110111
4、#include <stdio.h>     #include <stdlib.h>
     int main()  {    int i =129;      char cha= (char)i;     int b = (int)cha;                 printf("sign extension: %d/n",b);    system("pause");    return 1;  }
int 129 原码为 0x ffff ff81 或低8位是:  1000 0001, 计算机中补码和原码相同 
(char)i 后变为 1000 0001
(int)cha 后,从补码计算可得:1000 0001-1= 1000 0000 高位不变其他取反,原码为 11111 1111 即 -127


0 0
原创粉丝点击