不使用printf系列库函数,将十进制数以十六进制数形式输出

char *get16string(long num){     /*得到16进制形式的字符串*/
    int i = 0;
    char *buffer = (char*)malloc(11);
    char *temp;
    buffer[0] = '0', buffer[1] = 'x', buffer[10] = '\0';
    temp = buffer + 2;
    for(i=0;i<8;i++){
        temp[i] = (char)(num << 4 * i >> 28);  /*乘法优先级高于移位符, 移位符左结合*/
        temp[i] = temp[i] >= 0 ? temp[i] : temp[i] + 16; /*之所以会出现负数是因为:左移之后,若最高位为1,则编译器认为该数为负数,执行右移操作(该编译器执行算术移位)时,移入位均用1补齐*/
        temp[i] = temp[i] < 10 ? temp[i] + '0' : temp[i] - 10 + 'A' ;
    }/*从高位开始,每一次循环都取出num的二进制码中的四位,并转换成一个16进制的数值。*/
    return buffer;
}

int main(){
    int a = 7;
    printf("%d, test int size\n",sizeof(a));
    printf("%d, test translate\n",(char)(15<<28>>28));/*此时左移之后最高位为1*/
    printf("%d, test translate\n",(char)(15<<27>>27));/*此时左移之后最高位为0*/
    
    printf("%d, test \n",(char)(9<<28>>28));/* 1001 4位:-16*/
    printf("%d, test \n",(char)(17<<27>>27));/* 10001 5位:-32*/
    printf("%d, test \n",(char)(105<<25>>25));/* 1101001 7位:-128*/
  /*若一个n位(n为十进制数)二进制数的最高位为1,当把它的最高位认为是符号位时(把它作为补码),该数变为原值减去(2的n次方)。*/
    
    printf("456789 to Hexadecimal string:%s\n", get16string(456789));
    return 0;
}

原文地址:https://www.cnblogs.com/yiru/p/2713577.html