16,467
社区成员
发帖
与我相关
我的任务
分享
char str[20];
memset(str,0,20);
sprintf(str, "%8d,%8d", 123, 4567); //打印 " 123, 4567"
printf("%s\n",str);
memset(str,0,20);
sprintf(str, "%08d,%08d", 123, 4567); //打印 "00000123,00004567"
printf("%s\n",str);
memset(str,0,20);
sprintf(str, "%-8d,%8d", 123, 4567); //打印 "123 4567"
printf("%s\n",str);
memset(str,0,20);
sprintf(str, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
printf("%s\n",str);
memset(str,0,20);
sprintf(str, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐
printf("%s\n",str);
memset(str,0,20);
short si = -1;
sprintf(str, "%04X", si);
printf("%s\n",str);
/*
产生"FFFFFFFF",怎么回事?
因为spritnf 是个变参函数,除了前面两个参数之外,
后面的参数都不是类型安全的,函数更没有办法仅仅通过一个"%X"就能得知
当初函数调用前参数压栈时被压进来的到底 是个4 字节的整数还是个2 字节的短整数,
所以采取了统一4 字节的处理方式,导致参数压栈时做了符号扩展,扩展成了32 位的整数-1,
打印时4 个位置不够了,就把32 位整数-1 的8 位16 进制都打印出来了。
*/
//如果你想看si 的本来面目,那么就应该让编译器做0 扩展而不是符号扩展(扩展时二进制左边补0 而不是补符号位):
memset(str,0,20);
si = -1;
sprintf(str, "%04X", (unsigned short)si);
printf("%s\n",str);
unsigned short sij = -1;
memset(str,0,20);
sprintf(str, "%08X", sij);
printf("%s\n",str);
/*
sprintf 和printf 还可以按8 进制打印整数字符串,使用"%o"。注意8 进制和16 进制都不会打
印出负数,都是无符号的,实际上也就是变量的内部编码的直接的16 进制或8 进制表示。
*/
CString BinFormat(ULONGLONG in_data)
{
CString str = _T("");
int Bin_size = sizeof(in_data) * 8;
char *buff = (char *)GlobalAlloc(GPTR,Bin_size+1);
ASSERT(buff);
while(Bin_size--)
{
buff[Bin_size] = (in_data & 0x01)? '1':'0';
in_data >>= 1;
}
str = buff;
GlobalFree(buff);
return(str);
}
int a = 18;
CString szNum;
itoa(a, szNum.GetBuffer(0), 2);//后面的"2"代表二进制
MessageBox(szNum);