一.整数在内存中的存储
整数的二进制表示方法有三种,即原码、反码和补码
三种表示方法均有符号位和数值位两部分,符号位都是用0表示‘正’,用1表示’负‘,而数值位最高位的一位是被当作符号位,剩余的都是数值位
正整数的原、反、补码都相同
负整数的三种表示方法各不相同
原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码
补码:反码+1就得到补码
对于整数来讲,数据存放内存中其实存放的是补码.
1.1截断
什么是截断?
截断(Truncation)是指将一个较大的数据类型转换为较小的数据类型时,丢弃高位字节或位的过程。
当将一个较大的数据类型转换为较小的数据类型时,可能会发生截断。截断意味着丢弃较大数据类型的高位字节或位,只保留较小数据类型所能表示的范围内的值。这可能导致数据的精度丢失或溢出。
例如,将一个32位整数(4个字节)转换为16位整数(2个字节)时,会丢弃高16位字节,只保留低16位字节。这就是截断。 int->short即会发生截断
1.2整型提升
什么是整型提升?
C语⾔中,整型算术运算总是⾄少以缺省(缺省就是默认的意思)整型类型的精度来进⾏的。
为了获得这个精度,表达式中的字符和短整型操作数在使⽤之前被转换为普通整型,这种转换称为整型提升。
1.2.1意义
表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀ 般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。
因此,即使两个char类型的相加,在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准⻓度。
通⽤CPU(general-purpose CPU)是难以直接实现两个8⽐特字节直接相加运算(虽然机器指令中 可能有这种字节相加指令)。所以,表达式中各种⻓度可能⼩于int⻓度的整型值,都必须先转换为 int或unsigned int,然后才能送⼊CPU去执⾏运算。
也就是说,假设c1和c2是char类型,那么要先将要实现c1+c2,就需要对c1和c1进行整型提升之后进行运算,那么假设我们用char类型的c3去接收c1和c2的结果,由于char类型是一个字节,所以会发生截断。截断之后,只会保留低位的字节存储在c3中!!
1.2.2如何进行整型提升
1. 有符号整数提升是按照变量的数据类型的