【问题标题】:how to solve this error in c type conversion?如何解决c类型转换中的这个错误?
【发布时间】:2014-05-16 04:38:51
【问题描述】:
#include <stdio.h>
#include <string.h>
typedef unsigned int uint32;
typedef unsigned char uint8;
int main()
{
    double a = 1320.134;
    uint32 b;
    uint8 c[20];
     b = (unsigned int)a;
    c[3] = b;      //c[3] = (unsigned char)b;
    printf("value of %c", c[3]);
    return 1;
}

我正在尝试在我的程序中进行一些类型转换。在主要功能内部 - 1:我正在转换并将其存储在双精度中。 2:我想将 uint32 值存储在第三个位置的字符数组中,但如果我按照上面的操作,我无法获得输出。请有人帮我解决这个问题??

输出:c

【问题讨论】:

    标签: c arrays pointers type-conversion unsigned


    【解决方案1】:

    这里是正在发生的事情的概述:

    首先你设置:uint32 b = (unsigned int)(1320.134),它就是b = 1320

    1320 是一个多于 8 位的数字,因此它不仅适合 8 位空间 (c[3]),因此它强制将其放入其中并忽略剩余位,因此您得到 1320% 256(%表示除法后的余数),正好是40。现在,这个数字,当转换成ascii字符形式,然后打印出来。

    修订:

    所以据我了解,您希望下一个元素有一些溢出,因此您需要做一些复杂的指针工作。以下是我的做法。

    uint32 b = 1320;
    uint8 c[20];
    
    //first, get a pointer to the 3rd array element, and convert it to a uint32 pointer:
    uint32 *pointer = &c[3];
    //now, lets dereference it and put the value into the location:
    *pointer = b;
    

    这应该会产生适当的溢出,但我很好奇,你可能想要这样做是为了什么?

    顺便说一下,它的存储方式如下:

    | | | |40|5 | ...
    

    原因是 1320 的二进制表示是 10100101000。这是向后存储在内存中的,并且位最终是这样放置的:

    | | | |00010100|10100000|
    

    当读取(向后)时,00010100 等于 40,10100000 等于 5

    【讨论】:

    • 有没有办法将我的结果存储在字符数组中??
    • 你想溢出到下一个数组元素吗?
    • 如何将其存储在下一个数组元素中??
    • 假设一个数字长为三位数,每个数组元素只能容纳 2。您希望将 123 插入第一个元素为 12| | 还是 12|3 |
    • 将元素存储为12|3|
    【解决方案2】:

    如何阅读c[3]中的1320

    从数学上讲,无法从单个unsigned char 中读取大于 255 的任何内容。您看到的值 40(0x28,表示左括号字符)是 1320 的最后八位 - 0x528 截断的结果。

    【讨论】:

    • 谢谢你,还有一个问题:我会把它改成 typedef unsigned int uint8 c[];那么它将是1字节大小。不是吗??
    • @user3458454 charunsigned char 是一个字节(C 标准实际上要求这样做)。如果您键入def unsigned int,您将获得c[] 数组的每个元素至少两个字节;在大多数现代系统上,数组的每个元素都会得到四个字节。
    • 有没有办法将我的结果存储在字符数组中??
    • @user3458454 在字符数组中 - 是的,当然,但不在字符数组的单个元素中,因为您希望存储的数字有 11 位,所以它不适合八位字节。存储 1320 数字至少需要两个 8 位元素。
    【解决方案3】:

    使用

    printf("value of %d", c[3]);
    

    而不是

    printf("value of %c", c[3]);
    

    另外,8位无符号整数最高可达255,超出部分会被截掉。

    【讨论】:

    • @ErnestFriedman-Hill 实际上,编译器将从内存(寄存器)中获取最后 8 位并将其分配给 c[3]。
    • 谢谢你,还有一个问题:我会把它改成 typedef unsigned int uint8 c[];那么它将是1字节大小。不是吗??
    • @user3458454 您可以使用sizeof(int)sizeof(uint8) 查看它们有多少字节。
    • 如果我这样给出: printf("value of %d", c[3]);然后我得到 40 作为输出:(
    • @user3458454 当然。一个字节不能存储1320,它可以存储高达255。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 2021-12-21
    • 2019-09-15
    相关资源
    最近更新 更多