类型转换时需要注意的两点(小知识)

类型转换时需要注意的两点(小知识)

扩展(Extension)

当我们将两个不同长度的数据类型进行转换,就会发生以下情况

从长度小的类型转换成长度大的类型

假设我们有一个w位的数据类型,我们像将其转换成w+k位的数据类型(保证数字不变)

两种扩展(Two different kinds of extension)

  • 补零扩展(zero extension):用于unsigned类型
    • 在左边补充的位置补零

类型转换时需要注意的两点(小知识)_第1张图片

  • 补sign位扩展(sign extension):用于signed类型(如果不指定unsigned绝大多数类型都是signed)
    • 在左边补充的位置补sign位的bit,如果之前sign位是1就补1,如果sign位是0就补0

类型转换时需要注意的两点(小知识)_第2张图片

unsigned short sx = 233;
unsigned int x = sx; /*用到补零扩展*/
/*因为short和int都被定义为unsigned,所以这
  个时候为了保证数字不变,我们使用补零扩展*/

short sy = -233;
int y = sy; /*用到sign位扩展*/
/*因为short和int都被定义为signed,所以这
  个时候为了保证数字不变,我们使用补零扩展*/

正确性(Extension Preserves the Value)

  • 补零扩展(zero extension),在左边补0很明显对整体的值不会有任何影响因为他们的权重都是0,所以不会改变整体的值
  • 补sign位扩展(sign extension),在左边补sign位的值,这时候我们需要分开讨论
    • 原值X是正数:很明显和补零扩展(zero extension)一样,补的位是0不会对整体值有影响
    • 原值X是负数:我们可以通过数学归纳法来验证
      • 假设我们仅仅扩展1位,那么X的最高有效位w(MSB)贡献了-2^{w-1},现在扩展了一位之后X的最高有效位w和X'的最高有效位w+1之和是-2^w+2^{w-1}=-2^{w-1}
      • 因为X和X'的w-1...0位都是一样的,又因为X的最高有效位w和X'的最高有效位w+1加上w数值相等-2^w+2^{w-1}=-2^{w-1}。所以当扩展1位时,正确性成立(Hold)
    • 接下来假设扩展k位依然成立,然后证明k+1也成立,并完成证明,再次就不过多赘述。

类型转换时需要注意的两点(小知识)_第3张图片

舍(Truncation)

(未完待续...)

 

你可能感兴趣的:(小知识,c++,c语言)