如何解决c类型转换中的这个错误?

时间:2014-04-04 03:41:12

标签: c arrays pointers type-conversion unsigned

#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&lt;的值。 //一些垃圾值 如何阅读c [3]中的1320?

3 个答案:

答案 0 :(得分:3)

  

如何阅读1320

中的c[3]

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

答案 1 :(得分:0)

使用

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

而不是

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

此外,8位无符号整数可以高达255.超出部分将被切断。

答案 2 :(得分:0)

以下是对正在发生的事情的概述:

首先设置:uint32 b = (unsigned int)(1320.134),只需b = 1320

1320是一个多于8位的数字,因此它不适合8位空间(c[3]),所以相反它强制它在那里并忽略剩余的位,所以相反你得到1320%256(%表示除法后的余数),恰好是40。现在,这个数字在转换成ascii字符形式时会打印出来。

REVISION:

所以根据我的理解,你希望在下一个元素中有一些溢出,所以你需要做一些复杂的指针工作。我就是这样做的。

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