unsigned long型数据转二进制

cissy_qian 2015-05-29 12:38:43
void Num_Binary(INT32U vari,char *str)
{
int i;
temp = vari;
for(i = 31;i != -1;i--)
{
*(str+i) = (vari & 1)+'0';
vari = vari>>1;
temp2 = vari;
}
*(str+32) = 0;
}
这是个把unsigned long型数据变成二进制的函数,放在主程中计算时,temp读取的vari是正确的,但这个函数在其他.c文件中被调用时,数据就不正确了,但是unsigned int型就是正确的,为什么呢?
...全文
766 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
均陵鼠侠 2015-06-01
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
笑口常开,笑天下可笑之人。
按赵老湿往常的逻辑,似乎不是这样的。赵老湿的逻辑应当是我笑天下人,天下人亦笑我。
赵4老师 2015-06-01
  • 打赏
  • 举报
回复
笑口常开,笑天下可笑之人。
均陵鼠侠 2015-06-01
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
[quote=引用 6 楼 sholber 的回复:] 看到楼上有些人用的语言是C,而编程风格和编程习惯还停留在BASIC,哥决定再写一个新的版本:
# include <limits.h> 
# include <stddef.h>   

typedef unsigned long INT32U;   

void num_binary (INT32U vari, char * str)  
{
     for (size_t x = sizeof (INT32U) * CHAR_BIT; x > 0; x --) 
          * (str ++) = (vari >> x - 1 & 1) + '0';
     * str = '\0';  
}
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。 意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。 试对比 图书馆(对图书的分类够结构化了吧) 和 搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索) 哪个处理信息更方便、更高效。 所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。 结构越复杂,越难修改,越难除错。 有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。 程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George [/quote] 赵老湿不但会用 C写一些看起来不像 C的代码,还擅长纸上谈兵啊。就一个计算2+3的程序,居然还扯上了设计模式和敏捷。还没参加乡试和殿试呢,就开始考虑如何当一个清官了,真是可笑。
赵4老师 2015-06-01
  • 打赏
  • 举报
回复
引用 6 楼 sholber 的回复:
看到楼上有些人用的语言是C,而编程风格和编程习惯还停留在BASIC,哥决定再写一个新的版本:
# include <limits.h> 
# include <stddef.h>   

typedef unsigned long INT32U;   

void num_binary (INT32U vari, char * str)  
{
     for (size_t x = sizeof (INT32U) * CHAR_BIT; x > 0; x --) 
          * (str ++) = (vari >> x - 1 & 1) + '0';
     * str = '\0';  
}
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。 意思是你程序结构看上去再合理,再简洁,也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错,更方便修改,出错了更容易找到哪里出错和具体出错的原因,更容易改正错误。 试对比 图书馆(对图书的分类够结构化了吧) 和 搜索引擎(可看作是扁平化任何结构数据,仅支持全文检索) 哪个处理信息更方便、更高效。 所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。 结构越复杂,越难修改,越难除错。 有时(甚至大多数时候),看上去越合理、越简洁的代码,运行起来性能越差,出错时查找原因越难,找到出错原因后改正越费劲。 程序员要做的不是尽力避免错误,而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误,“快速的失败”远胜过“预防错误”。Fred George
均陵鼠侠 2015-05-30
  • 打赏
  • 举报
回复
看到楼上有些人用的语言是C,而编程风格和编程习惯还停留在BASIC,哥决定再写一个新的版本:
# include <limits.h> 
# include <stddef.h>   

typedef unsigned long INT32U;   

void num_binary (INT32U vari, char * str)  
{
     for (size_t x = sizeof (INT32U) * CHAR_BIT; x > 0; x --) 
          * (str ++) = (vari >> x - 1 & 1) + '0';
     * str = '\0';  
}
赵4老师 2015-05-29
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int main() {
    int i,v;
    char bs[33];
    char b[33];
    char hs[9];
    char h[9];
    char s[4];
    char *e;

// 十进制整数转二进制串;
    i=1024;
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("i=%d,bs=%s\n",i,bs);
// 十进制整数转十六进制串;
    i=1024;
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("i=%d,hs=%s\n",i,hs);
// 十六进制字符串转成十进制数
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    printf("hs=%s,i=%d\n",hs,i);
// 二进制字符串转化为十六进制字符串;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("bs=%s,hs=%s\n",bs,hs);
// 二进制字符串转化为十进制数;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    printf("bs=%s,i=%d\n",bs,i);
// 十六进制字符串转成二进制串
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("hs=%s,bs=%s\n",hs,bs);
// ASC\GBK字符串转十六进制串
    strcpy(s,"a汉");
    i=0;
    while (1) {
        if (0==s[i]) break;
        sprintf(hs+i*2,"%02X",(unsigned char)s[i]);
        i++;
    }
    setlocale(LC_ALL,"chs");
    printf("s=%s,hs=%s\n",s,hs);
// 十六进制字符串转成汉字(GBK)及字符(ASC)
    strcpy(hs,"61BABA");
    i=0;
    while (1) {
        if (1!=sscanf(hs+i*2,"%2x",&v)) break;
        s[i]=(char)v;
        i++;
    }
    s[i]=0;
    printf("hs=%s,s=%s\n",hs,s);

    return 0;

}
//i=1024,bs=00000000000000000000010000000000
//i=1024,hs=00000400
//hs=00000400,i=1024
//bs=00000000000000000000010000000000,hs=00000400
//bs=00000000000000000000010000000000,i=1024
//hs=00000400,bs=00000000000000000000010000000000
//s=a汉,hs=61BABA
//hs=61BABA,s=a汉
老而不死 2015-05-29
  • 打赏
  • 举报
回复
测试可用

#include <stdio.h>
#include <stddef.h>

typedef unsigned long INT32U;

void num_binary (INT32U vari, char *str)
{
    INT32U temp = 1;
    char c;
    int i = sizeof(vari) * 8;
    int m = 0;
    printf("lenght of INT32U:%d\n",i);
    for(m = 0; m < i; m++){
        //printf("m = %d\n",m);
        //c = (vari & temp) + '0';
        //printf("c = %c\n",c);
        int n = 0;
        if(vari & temp)
            n = 1;
        *(str+m) = (char) ( n + '0');
        temp = temp << 1;
    }
    *(str+i) = '\0';
}

int main(void)
{
    char *str = NULL;
    int in;
    str = (char*)malloc(100*sizeof(char));
    INT32U i = 8858;
    num_binary(i, str);
    printf("i = %d is %s\n",i, str);

    scanf("%d",&in);
    num_binary(in,str);
    printf("in = %d is %s\n",in, str);

    free(str);
//    printf("str = %.8s %.8s %.8s %.8s\n", *str,*str+8, *str+16, *str+32);
}
苏叔叔 2015-05-29
  • 打赏
  • 举报
回复
有bug char str[32]; 改为 char str[33];
苏叔叔 2015-05-29
  • 打赏
  • 举报
回复
没什么问题:

typedef unsigned int INT32U;
void Num_Binary(INT32U vari, char *str)
{
	int i;
	//temp = vari;
	for (i = 31; i != -1; i--)
	{
		*(str + i) = (vari & 1) + '0';
		vari = vari >> 1;
		//temp2 = vari;
	}
	*(str + 32) = 0;
}
int main(void)
{
	INT32U i = 32;
	char str[32];
	Num_Binary(i, str);
	printf("str=%.8s %.8s %.8s %.8s\n", str, str + 8, str + 16, str + 24);
	return 0;
}
//00000000 00000000 00000000 00100000
均陵鼠侠 2015-05-29
  • 打赏
  • 举报
回复
# include <limits.h>
# include <stddef.h>

typedef unsigned long INT32U;

void num_binary (INT32U vari, char * str)
 {
     union {INT32U v; unsigned c:1;} u;
     for (size_t x = 0; x < sizeof (INT32U) * CHAR_BIT; x ++)
        * (str ++) = (u.v = vari >> x, u.c + '0');
    * str = '\0';
 }

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧