C编程 - 2U和1024U的大小

问题描述 投票:-1回答:2

我知道U字面意思是c,该值是无符号整数。无符号intagers大小为4个字节。

但是2U或1024U有多大?这仅仅意味着2 * 4字节= 8字节,或者这种表示法是否意味着2(或1024)是无符号整数?

我的目标是弄清楚如果我像这样调用malloc将分配多少内存

int *allocated_mem = malloc(2U * 1024U);

并在一个简短的程序中证明我的回答是我尝试过的

printf("Size of 2U: %ld\n", sizeof(2U));
printf("Size of 1024U: %ld\n", sizeof(1024U));

我希望第一行的大小为2 * 4 Bytes = 8,而第二行的大小为1024 * 4 Bytes = 4096,但输出始终为“4”。

真的很感激2U和1024U的确切含义,我如何在C中查看它们的大小?

c memory-management malloc sizeof
2个回答
2
投票

我的目标是弄清楚如果我像这个int *allocated_mem = malloc(2U * 1024U);一样调用malloc将分配多少内存

2 * 1024 == 2048有什么困难?它们是无符号文字的事实并没有改变它们的价值。


无符号整数大小为4个字节。 (原文如此)

你是对的。所以2U占用4个字节,而1024U占用4个字节,因为它们都是无符号整数。


我希望第一行的大小为2 * 4 Bytes = 8,而第二行的大小为1024 * 4 Bytes = 4096,但输出始终为“4”。

为什么价值会改变大小?大小仅取决于类型。 2U的类型为unsigned int,因此占用4个字节;与50U相同,与1024U相同。它们都占用4个字节。

您试图将值(2)乘以类型的大小。这是没有意义的。


0
投票

多大?

2U1024U的大小相同,大小与unsigned相同,通常为32位或4“字节”。在给定平台中,类型的大小是相同的 - 它不会因为价值而改变。

“我知道U字面意思是c,该值是无符号整数。” - >好的,到目前为止足够近。

“无符号整数大小为4个字节。”合理猜测C还要求unsigned至少为16位。此外,U使常数无符号,但可能是unsignedunsigned longunsigned long long,取决于价值和平台。

细节:在C中,2U不是文字,而是常数。 C有字符串文字和复合文字。文字可以有他们的地址,但&2U无效C.其他语言称2U为文字,并对如何使用它们有规则。

我的目标是弄清楚如果我像这个int *allocated_mem = malloc(2U * 1024U);一样调用malloc将分配多少内存

相反,更好地使用size_t进行大小调整而不是unsigned并检查分配。

size_t sz = 2U * 1024U;
int *allocated_mem = malloc(sz);
if (allocated_mem == NULL) allocated_mem = 0; 
printf("Allocation size %zu\n", allocated_mem);

(旁白)小心计算尺寸。使用size_t类型做你的大小数学。 4U * 1024U * 1024U * 1024U可以溢出unsigned数学,但可以根据需要计算size_t

size_t sz = (size_t)4 * 1024 * 1024 * 1024;

下面尝试打印常量的大小,这可能是32位或4“字节”而不是它们的值。

printf("Size of 1024U: %ld\n", sizeof(1024U));
printf("Size of 1024U: %ld\n", sizeof(2U));
© www.soinside.com 2019 - 2024. All rights reserved.