在c语言中,如果不使用算术,如何将整数拆分为字节?

在c语言中,如果不使用算术,如何将整数拆分为字节?,c,math,C,Math,我正在用C语言实现四个基本的算术函数(加、减、除、乘) 我想象的这些功能的基本结构是 程序由用户使用scanf获取两个操作数 程序将这些值拆分成字节并计算 我已经完成了加法和减法 但是我忘了我不应该使用算术函数 因此,当将整数拆分为单个字节时 我写了这样的代码 while(quotient!=0){ bin[i]=quotient%2; quotient=quotient/2; i++; } 但是因为有一些算术函数我不应该使用 所以我必须重写那些分割的部分 但我

我正在用C语言实现四个基本的算术函数(加、减、除、乘)

我想象的这些功能的基本结构是

程序由用户使用scanf获取两个操作数

程序将这些值拆分成字节并计算

我已经完成了加法和减法

但是我忘了我不应该使用算术函数

因此,当将整数拆分为单个字节时

我写了这样的代码

    while(quotient!=0){
    bin[i]=quotient%2;
    quotient=quotient/2;
    i++;
}
但是因为有一些算术函数我不应该使用

所以我必须重写那些分割的部分

但我真的不知道如何不使用 %或者/

我假设32位整数(如果不是这种情况,那么只需更改大小)有更多的方法:

  • 字节指针

    #include<stdio.h>
    int x; // your integer or whatever else data type
    BYTE *p=(BYTE*)&x;
    x=0x11223344;
    printf("%x\n",p[0]);
    printf("%x\n",p[1]);
    printf("%x\n",p[2]);
    printf("%x\n",p[3]);
    
  • [edit2]逻辑/位操作

    • xn
      -是x的左右移位n位
    • x&y
      -是按位逻辑and(对每个位分别执行逻辑and)
    • 例如,当您有32位
      无符号int
      (称为
      DWORD
      )时,您可以将其拆分为如下字节:

      DWORD  x; // input 32 bit unsigned int
      BYTE a0,a1,a2,a3; // output BYTES a0 is the least significant a3 is the most significant
      x=0x11223344;
      a0=DWORD((x    )&255); // should be 0x44
      a1=DWORD((x>> 8)&255); // should be 0x33
      a2=DWORD((x>>16)&255); // should be 0x22
      a3=DWORD((x>>24)&255); // should be 0x11
      
    • 这种方法不受endianness的影响

    • 但它使用ALU
    • 关键是移动要定位的位
      0..7
      位,并屏蔽其余的位
    • 并非所有编译器都需要使用
      &255
      DWORD()
      过度键入,但有些编译器在没有它们的情况下会做一些奇怪的事情,特别是在有符号变量(如char或int)上

    • x>>n
      x/(pow(2,n))=x/(1相同,可以使用类型双关来访问变量的字节。
      根据标准C(C99和C11),只有
      无符号字符
      才能确保以安全的方式执行此操作

      这可以通过以下方式完成:

      typedef unsigned int myint_t;
      myint_t x = 1234;
      union {
        myint_t val;
        unsigned char byte[sizeof(myint_t)];
      } u;
      
      现在,您当然可以通过以下方式访问x的字节:

      u.val = x;
      for (int j = 0; j < sizeof(myint_t); j++)
         printf("%d ",u.byte[j]);
      
      u.val=x;
      对于(int j=0;j
      然而,正如WhozCrag所指出的,endianness存在一些问题。
      不能假定字节的顺序是确定的。
      因此,在使用字节进行任何计算之前,您的程序需要检查endianness是如何工作的

      #include <limits.h> /* To use UCHAR_MAX */
      
      unsigned long int ByteFactor = 1u + UCHAR_MAX; /* 256 almost everywhere */
      u.val = 0;
      
      for (int j = sizeof(myint_t) - 1; j >= 0 ; j--)
        u.val = u.val * ByteFactor + j;
      
      #include/*使用UCHAR\u MAX*/
      无符号长整型ByteFactor=1u+UCHAR_MAX;/*256几乎无处不在*/
      u、 val=0;
      对于(int j=sizeof(myint_t)-1;j>=0;j--)
      u、 val=u.val*ByteFactor+j;
      
      现在,当您打印u.byte[]的值时,您将看到类型
      myint\u t
      的字节排列顺序。
      不太重要的字节将有0个值。

      你是指分裂成比特,而不是字节吗?我不担心在输入到比特转换中使用算术运算符。毕竟,你利用了更多的算法内置到<代码> SCANF中进行十进制输入到C-T转换。输入处理和担心一旦你有了位数组就使用或不使用算术。是的,这是我的家庭作业..我不擅长:-(小心;联合产生的输出可以(在大多数情况下,会)根据运行平台的不同,差异很大。@WhozCraig是的,我同意,因此我将0x11223344写入了输入,以便在输出中可以看到平台的使用顺序。但是,是的,我可以在备注(so+1)中提到。为什么要否决投票?不是在不使用ALU的情况下提供不同的答案…?问题标记为“c”只是,不是C++。重新编辑了答案(改变了Prtf的CUT,并添加了一些注释),你能告诉我更多关于使用和>的信息吗?
      u.val = x;
      for (int j = 0; j < sizeof(myint_t); j++)
         printf("%d ",u.byte[j]);
      
      #include <limits.h> /* To use UCHAR_MAX */
      
      unsigned long int ByteFactor = 1u + UCHAR_MAX; /* 256 almost everywhere */
      u.val = 0;
      
      for (int j = sizeof(myint_t) - 1; j >= 0 ; j--)
        u.val = u.val * ByteFactor + j;