读书人

char c = 0x86; printf(quot;%x\nquot; c lt;lt; 8

发布时间: 2012-04-24 14:15:38 作者: rapoo

char c = 0x86; printf("%x\n", c << 8); printf("%llx\n", c << 8);

C/C++ code
//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


[解决办法]
printf("%llx\n", c << 8); //这里为什么输出7accc0ffff8600而不是0xffffffffffff8600

c是char. c<<8也是char.扩展最多到int.而printf根本不知道你的类型.只知道读入一个 longlong类型
的8字节数据.
所以,多的 4个字节的内容可能是内存中随机取的,于是出现了上面的结果.

读书人网 >C语言

热点推荐