Reg为寄存器设计
字长,是说这个寄存器是多少宽的,每一个寄存器能够表示32bit数据,也是说CPU与RAM每一次传递的数据也是32bit3d
计算机内部一切都是二进制code
全部的类型,只是说咱们以什么方式去看待它,并非代表,它在内部是怎么 表达的。blog
18 -> 00010010内存
-18 -> ?编译器
咱们在作十进制运算时,咱们实际上老是把负号先抛掉,把它当作一个整数作运算,在运算的结果上再解决负号问题。it
例如:12+(-18)-> 12-18 -> -6io
12 * -18 -> -(12 * 18)编译
第一种方法须要在计算时须要添加符号来控制符号,不利于计算机内部的设计class
第二种方法在使用时须要与中间数进行运算来判断当前数的具体数值
两种方法都使得计算机的输入输出变得复杂。
实际计算机中使用的是补码来表示负数
补码思想:
256是2^8就是256((1)00000000),2^8-1就是-1的补码
补码的意义就是拿补码和原码能够加出一个溢出的“零”
这样能够直接作普通的二进制运算,不须要进行+-符号的变换
高位为0,表示1-127
高位为1,表示-1 - -128
#include <stdio.h> int main() { char c = 255; int i = 255; printf("c=%d,i=%d\n",c,i); // 对于char c 来讲为11111111最高位为1是负数 //对于int(32bit) i来讲为00000000 00000000 00000000 11111111 return 0; }
int的范围
-2^32-1^ ~ 2^32-1^-1
char 表达的是-128 ~ 127(中间有0)
全部整数类型范围,在是2^n-1^ ~ 2^n-1^-1
若是想将11111111当作一个纯二进制的来看须要unsigned来表达
unsigned的意思是这个整数不以补码的形式表示,没有负数,使得正数的表达范围被扩大。
00000000-11111111 unsigned表示0-255,原来是-128~127
第二个01111111是127,加1 后原本是128,但128做为一个整数char来讲,它所表达的是-128
将数的范围想象成一个圆
对一个unsigned char来讲,127+1就等于128,若是是255,+1才变成0
因此对于unsigned char来讲,另外一个圆
使用数的范围能够找出int的最大数来,这也是翁凯老师留的一个小测验。
主要思想仍是不断累加(while循环),当最后累加的数小于0时,用这个数再减1就等到int能表示的最大值
全部小于int的,char、short、int都采用相同的输出就是用%d;全部比int大的,须要用%ld
#include <stdio.h> int main() { char c = -1; int i = -1; printf("c=%u,i=%u\n",c,i); return 0; }
上面结果同样都是4294967295(-1表示全1),这个数是unsigned int所能表达的最大的数,char正常-1只有一个字节,只有最低位为1,当咱们把小于int的变量传给printf时,编译器会把变量转换为int传进去,由于是有符号的,会被扩展为全部位都是1,最后做为unsigned结果就是如今这个结果。
#include <stdio.h> int main() { char c = 012; int i = 0x12; printf("c=%d,i=%d\n",c,i); //%o是8进制,%x是16进制 return 0; } //输出结果为c=10,i=18
%d是想让它以十进制的方式输出。
八进制,1x8+2x1=10;十六进制,1x16+2x1=18
进制只是咱们怎么去看它,并不表明在计算机内部它会表示成八进制或十六进制,
计算机内部永远只有二进制,你在程序中写个八进制,编译器会替你转成对应的十进制形式去变成二进制交给计算机
小总结:
0001 (1) 00010(2)前四个bit表达为1,后四个为2,12就能够表达前面的二进制数,16进制的两位正好表达一个char(1个字节)
CPU每次从内存中读一次数据,每一次向其中写一次数据,就是一个int,若是你让它作一个char,实际上它作的就是把32 bit的数据所有读进来,而后从当中拿出那8 bit给你。