请问这道题目怎么做?没有接触过类似的。。。
题目:用C语言实现将数组如 unsigend char a={0×11,0×22,0×33,0×44},转换成一个32位的整型数i=0×11223344;
在以下语句基础上完成程序设计
unsigned char a={0×11,0×22,0×33,0×44};
int i = 0;
初学C不久,如果大佬在写答案之余愿意说一下思路,或者对应的书上的知识点就更好了,在此先谢过。 int main() {
usigned char a= {0x12, 0x34, 0x56, 0x78};
unsigned int result = 0;
for (int i=0; i<4; i++) {
result = result << 8 | a;
}
} 赚小钱 发表于 2020-6-23 22:09
感谢大佬回答,我有点疑问,请问result = result << 8 | a;里的左移8位为什么不会发生高位舍去的现象?比如说第一次左移后为0x0000 0000,在与0x12发生或运算后为0x0000 0012,在第二次循环中,又左移了8位,这里不会发生超过8位所以舍去高位的现象吗?为什么我在调试时发现循环中0x12左移8位之后为0x1200? 你把11乘1000,22乘100,33乘10加上44不就好了?一样的道理!
i=a*0x1000+a*0x100+a*0x10+a Sum9527 发表于 2020-6-23 23:16
感谢大佬回答,我有点疑问,请问result = result
第一,0x12 << 8 == 0x1200 是没有问题的
第二,你说错了,不是与(&),应该是或(|)
第三,只要保存结果的精度超过 32 位无符号整型就不会溢出,因为你一共就 4 个 8 位数。 本帖最后由 Sum9527 于 2020-6-26 23:42 编辑
赚小钱 发表于 2020-6-23 22:09
回复晚了,不好意思,谢谢大佬解惑,已经明白问题在哪了。
因为是16进制,16进制里的1位等于二进制的4位,所以二进制左移8位相当于16进制左移2位。 405794672 发表于 2020-6-24 08:12
你把11乘1000,22乘100,33乘10加上44不就好了?一样的道理!
i=a*0x1000+a*0x100+a*0x10+a
感谢你的回答,感觉你的这个答案比较适合我,不过最佳答案已经给出去了,不好意思啦。
不过可能要更改下,直接用你的答案没有得到想要的结果,因为少了个0。
改成:i =a*0x1000000+a*0x10000+a*0x100+a ;就好了
页:
[1]