[关闭]
@okokme 2018-06-25T14:44:19.000000Z 字数 1020 阅读 664

[心得]c语言关于char int 存储方式

c语言

---今天学校组织了认识实习,一个老师给我们出了一道c语言题,发现自己还有很多欠缺了解的不透彻的地方。或者是以前知道,但是最近用不到,就就此遗忘掉了,不过学习就是这样一个过程嘛。每一次复习回顾都会加深,拥有新的理解和收获。就来总结总结吧~

unsigned 与signed 区别

题目如下:

char a = 255;
int d = a+1;
int c = a;
printf("%d",a);
printf("%d",d);
  1. 通常长度为8的位模式被称为一字节
  2. char变量占一个字节
  3. 几乎所有的计算机都使用 “二进制补码表示法” 来存储位于n位存储单元中的有符号整数
  4. 了解 原码,反码,补码 关系
  1. 在二进制补码表示法中,最左位决定符号,如果是0那它为正,若是1为负。
  2. 以二进制补码格式存储整数,计算机遵循以下步骤:
  3. 1.将整数变成n位二进制数
  4. 2.如果最左位是1,计算机取其补码,如果是0计算机不进行操作
  5. 以二进制补码格式还原整数,计算机遵循以下步骤:
  6. 1.如果最左位是1,计算机取其补码,如果是0计算机不进行操作
  7. 2.计算机将该整数转换为十进制
  8. 二进制补码运算:按位取反再+1

char在编译器下存储为有符号型整形
255 = (11111111)
ps:因其从0开始..2的0次方+2的1次方直到2的7次方,虽然这是个学计算机都知道的东西但是今天一糊涂在这里纠结了好久2的8次方问题==
因为计算机存储使用二进制补码表示法存储为(11111111)
读取输出时因最左位为1,将其还原时,以二进制补码格式还原成整数。所以在读取过程中机器会将最高位1识别后认为其为负数,对其进行补码操作。即为(10000001)然后将其转化为十进制整数输出为-1

再者,在32位环境下,int型占4个字节占4*8=32位
d = a + 1 的操作为
                                                 11111111
00000000000000000000000000000001
——————————————————
00000000000000000000000000000000(32个0)
根据规则,位数跟从位数少的计算,a为char型8位对它进行加int型运算还是char型8位。
只是此时进行加法溢出为 00000000,因为d为int型 再进行位次补齐为32个0。
将其转化为整数为0输出

还有一点是:unsigned 与signed 区别
eg: int -32768~32767 (-2^15 ~ 2^15-1)
         unsigned int 0~65535 (0 ~ 2^16)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注