是否可以制作一个包含无符号int的数组?

时间:2018-10-19 06:50:00

标签: c++

我目前正在尝试使其在数组中保存rgba数据(0x00000000→0xFFFFFFFF)的地方,当我将一个值超过2,147,483,647时,它溢出了,我假设是由于某种可能的转换(可能是无符号的→有符号的)。 / p>

这是我的代码:

int main(int argc, char* args[]) {
    uint32_t *background = new uint32_t[1920*1080];

    background[100] = 0xFF0000FF; //red, 4278190335
    printf("%d, ", background[100]);

    return 0;
}

以下是输出:

-16776961

我还是C ++的新手,所以如果我对某些事情忘了,请指出。

3 个答案:

答案 0 :(得分:9)

首先,请注意:

uint32_t *background = new uint32_t[1920*1080];

在这里,background不是数组(在堆栈中),而是在分配内存(包含数组)并保存指向第一个元素的指针。您将需要删除内存。在C ++中,使用std::vector要容易得多:

// at the top: #include <vector>
std::vector<uint32_t> background(1920*1080);

这将自动解除分配(因此您不必担心)。另一个选择是使用数组,但在这种情况下,最好不要使用数组,因为那里有很多内存(8 MiB),这可能会破坏堆栈。

现在,如果要使用printf打印unsigned int,则需要使用%u(如果需要十六进制,则需要使用%x):

printf("%u, ", background[100]); // or...
printf("%x, ", background[100]);

但是,在您的代码中,您使用的是uint32_t,它是固定类型的。为此,您需要使用:

// at the top: #include <cinttypes>
printf("%" PRIu32 ", ", background[100]); // or...
printf("%" PRIx32 ", ", background[100]); 

此外,作为@Someprogrammerdude评论的最后注释,您可以在C ++中使用std::cout

// at the top: #include <iostream>
std::cout << background[100] << std::endl; // or...
std::cout << std::hex << background[100] << std::dec << std::endl;

答案 1 :(得分:7)

更改此:

printf("%d, ", background[100]);

对此:

// #include <cinttypes>
printf("%" PRIu32 "", background[100]);

因为您要打印uint32_t,而不是int

PS:由于这是C ++,因此我强烈建议使用std::cout,它将自动处理这些问题。

PPS:由于您使用过new [],因此请不要忘记之后再使用delete []

答案 2 :(得分:0)

理解数字数据及其输出时的区别很重要。这里没有溢出。数据只是作为有符号值打印。您正在使用十六进制文字正确分配它。您还应该将其打印为十六进制而不是十进制。