char c = 0x86; printf("%x\n", c << 8); printf("%llx\n", c << 8);
//printf("%x\n", c << 8); 我弄懂了//printf("%llx\n", c << 8); 但这里运行结果还是跟我想的不一样。#include <stdio.h> int main(int argc, char **argv){ char c = 0x86; //char为有符号8位整型,0x86其实是负数 printf("%d\n", c); printf("%x\n", c); printf("%x\n", c << 8); //输出0xffff8600 printf("%llx\n", c << 8); //这里为什么输出7accc0ffff8600而不是0xffffffffffff8600 //printf("%llx\n", 0xffffffffffffffff); printf("%x\n", (unsigned char)0x86 << 8); return 0;}//计算机内部的运算都是通过补码进行的//0x86的原码为1000 0110,补码为1111 1010 //这8位二进制数里面最高位1是符号位//1111 1010 << 8 = 1111 1010 0000 0000 = 0xfa00 //这16位数里面最高位1是符号位//由于printf是用%x进行打印,%x为有符号32位整数,故将0xfa00提升为32位,故原本第16位的符号位应变为0,用32位二进制数的最高位来表示符号位//16位->32位,结果是1000 00000 0000 000 0111 1010 0000 0000 = 0x80007a00//0x80007a00是补码,转换成原码是0xffff8600//故printf("%x\n", c << 8); 输出0xffff8600