-
1.在内存中,不管是正数还是负数都是以补码的形式存储正数的原码、反码、补码都相同 负数的原码---(符号位不变,其余按位取反)---反码---(反码加一)---补码负数的补码---(符号位不变,其余按位取反)---反码---(反码加一)---原码 2.一般情况下,int,char等整型通常是有符号数。而char比较特殊,他在每个编译器中不同;有时候char代表的是signed char,有的表示的是unsigned char。unsigned整形和singed整形是有区别的:unsigned整形是没有符号的整形,就是不能表示正负数,而singed整形是有符号的整形,可以表示正负数,所以signed整形前第一位(0(正数)或1(负数))表示的正负,而unsigned整形第一位表示的只是数字大小,所以在两个之间强制类型转化是需要判断正负的关系。 例如: a:-1原码:10000000000000000000000000000001 反码:1111111111111111111111111111111110 补码:1111111111111111111111111111111111 因为是signed char类型,所以需要截断: 存放:11111111 输出(%d):要进行整型提升(前面补符号位): 补码:1111111111111111111111111111111111 反码:10000000000000000000000000000000 原码:10000000000000000000000000000001 b:-1 原码:10000000000000000000000000000001 反码:1111111111111111111111111111111110 补码:1111111111111111111111111111111111 因为是unsigned char,也需要截断: 存放:11111111 输出:(%u):整型提升时(前面补零,所以是整数):补码:00000000000000000000000011111111 反码:00000000000000000000000011111111 原码:00000000000000000000000011111111 所以输出:255 3.大小端(机器不同所以储存的位置可能也不同) 例如:20,在十六进制中应是这样的0x00000014 大端:数据的低位保存到了内存中的高地址处,数据的高位保存到了内存的低地址处(0x 00 00 00 14) 小端:数据的低位保存到了内存中的低地址处,数据的高位保存到了内存的高地址处(0x 14 00 00 00)