一、字扩展
字扩展是指将一个字节的变量扩展为两个或多个字节的变量。
1.1 概述
当一个字节的变量无法满足需要时,我们需要用两个或多个字节的变量来表示更大的数值或拥有更多的位数。这就是字扩展。
1.2 有符号字扩展
在有符号字扩展中,如果一个字节最高位是1(即为负数),那么扩展时要在高位补1,如果是0(即为正数),则在高位补0。
signed char c = -1; int i = c;
此时i的值为-1,在对有符号变量进行字扩展时,编译器会根据该变量的符号位来决定扩展时高位要补1还是0,以保证其值不变。
1.3 无符号字扩展
在无符号字扩展中,不论最高位是0还是1,在扩展时都要在高位补0。
unsigned char c = 255; unsigned int i = c;
此时i的值为255,在对无符号变量进行字扩展时,编译器会在高位补0。
二、位扩展
位扩展是指将一个变量的某些位数扩展为更多的位数,以便存储更多的信息。
2.1 概述
位扩展可以用于添加标记位或存储复杂的信息。位扩展可以分为左移位扩展和右移位扩展。
2.2 左移位扩展
左移位扩展是指将一个变量的所有位数向左移动一定的位数。
unsigned int value = 0x01; value = value << 8;
此时value的值为0x100,也就是说,原来的1向左移动了8位。
2.3 右移位扩展
右移位扩展是指将一个变量的所有位数向右移动一定的位数。
unsigned int value = 0x100; value = value >> 8;
此时value的值为0x01,也就是说,原来的1向右移动了8位。
三、代码示例
3.1 字扩展
有符号字扩展:
#include<stdio.h> int main() { signed char c = -1; int i = c; printf("%dn", i); return 0; }
无符号字扩展:
#include<stdio.h> int main() { unsigned char c = 255; unsigned int i = c; printf("%un", i); return 0; }
3.2 左移位扩展
#include<stdio.h> int main() { unsigned int value = 0x01; value = value << 8; printf("%xn", value); return 0; }
3.3 右移位扩展
#include<stdio.h> int main() { unsigned int value = 0x100; value = value >> 8; printf("%xn", value); return 0; }