C语言入门 – 字节类型提升与符号位填充详解

LongGuan_admin 发布于 8 天前 26 次阅读


总结:小字节类型提升大字节类型,按小字节的符号位填充大字节的内存空间

描述的是将有符号整数从一个小尺寸的类型(char ,一字节)转换(提升)为一个大尺寸的类型(int , 四字节)时,为了保证数值不变,计算机会用原小类的最高位(符号位)来填充新开辟出来的所有高位字节

  1. 字节大小
    • 小字节类型:指占用内存空间较小的数据类型 如char(一字节) short(两字节)
    • 大字节类型:值占用内存空间较大的数据类型 如int(四字节) long(八字节)
  2. 符号位
    • 在有符号整数中的二进制最高位,不表示数值,而是表示正负
    • 符号位为0:表示正数
    • 符号位为1: 表示负数
  3. 提升与填充
    • 当需要将一个小字节的有符号整数放到一个大字节的空间时,比如将 signed char 赋值给 int
      • 保留原数值的二进制位(低位二进制数)
      • 大空间中一般会在原二进制数的高位多出空位(1字节-4字节,多出24个空位)
      • 空位值的填充 一般使用小类型的符号位作为值进行填充
        • 如果符号位为正数(0),高位全部填充0
        • 如果符号位为负数(1),高位全部填充1
    • 目的
      • 保持数值的十进制意义不变,对于使用补码表示的负数,用1填充高位是保持负数值正确的唯一方法

提升一个正数

signed char c = 100;       // 二进制: 01100100 (符号位是0)
int i = c;                 // 提升到 int
// 提升过程:
// 1. 保留低8位:                        01100100
// 2. 高24位用符号位(0)填充: 00000000 00000000 00000000
// 最终 i 的32位二进制: 00000000 00000000 00000000 01100100
// 对应的十进制仍是 100。

提升一个负数

signed char c = -100; // 二进制(补码): 10011100 (符号位是1)
                      // 解释:10011100 是 -100 的8位补码表示。
int i = c;            // 提升到 int
// 提升过程:
// 1. 保留低8位: 10011100
// 2. 高24位用符号位(1)填充: 11111111 11111111 11111111
// 最终 i 的32位二进制: 11111111 11111111 11111111 10011100
// 这正好是 -100 的32位补码表示,十进制值仍是 -100。
此作者没有提供个人介绍。
最后更新于 2026-01-08