在c语言中,如果不使用算术,如何将整数拆分为字节?
我正在用C语言实现四个基本的算术函数(加、减、除、乘) 我想象的这些功能的基本结构是 程序由用户使用scanf获取两个操作数 程序将这些值拆分成字节并计算 我已经完成了加法和减法 但是我忘了我不应该使用算术函数 因此,当将整数拆分为单个字节时 我写了这样的代码在c语言中,如果不使用算术,如何将整数拆分为字节?,c,math,C,Math,我正在用C语言实现四个基本的算术函数(加、减、除、乘) 我想象的这些功能的基本结构是 程序由用户使用scanf获取两个操作数 程序将这些值拆分成字节并计算 我已经完成了加法和减法 但是我忘了我不应该使用算术函数 因此,当将整数拆分为单个字节时 我写了这样的代码 while(quotient!=0){ bin[i]=quotient%2; quotient=quotient/2; i++; } 但是因为有一些算术函数我不应该使用 所以我必须重写那些分割的部分 但我
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]);
-是x的左右移位n位xn
-是按位逻辑and(对每个位分别执行逻辑and)x&y
- 例如,当您有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
过度键入,但有些编译器在没有它们的情况下会做一些奇怪的事情,特别是在有符号变量(如char或int)上DWORD()
与x>>n
x/(pow(2,n))=x/(1相同,可以使用类型双关来访问变量的字节。
根据标准C(C99和C11),只有
才能确保以安全的方式执行此操作 这可以通过以下方式完成:无符号字符
现在,您当然可以通过以下方式访问x的字节:typedef unsigned int myint_t; myint_t x = 1234; union { myint_t val; unsigned char byte[sizeof(myint_t)]; } u;
u.val = x; for (int j = 0; j < sizeof(myint_t); j++) printf("%d ",u.byte[j]);
然而,正如WhozCrag所指出的,endianness存在一些问题。u.val=x; 对于(int j=0;j
不能假定字节的顺序是确定的。
因此,在使用字节进行任何计算之前,您的程序需要检查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;
现在,当您打印u.byte[]的值时,您将看到类型#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;
的字节排列顺序。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;