我知道 U 字面在 c 中的意思是,值是一个无符号整数。无符号标记器大小为 4 个字节。
但是 2U 或 1024U 有多大?例如,这是否仅表示 2 * 4 字节 = 8 字节,或者此表示法是否意味着 2(或 1024)是无符号整数?
我的目标是弄清楚如果我像这样调用 malloc 将分配多少内存
int *allocated_mem = malloc(2U * 1024U);
并在一个简短的程序中证明我的答案我尝试过什么
printf("Size of 2U: %ldn", sizeof(2U));
printf("Size of 1024U: %ldn", sizeof(1024U));
我会为第一行分配 2 * 4 字节 = 8 的大小,对于第二行,例如 1024 * 4 字节 = 4096,但输出始终为"4"。
真的很欣赏 2U 和 1024U 的确切含义以及如何在 C 中检查它们的大小?
我的目标是弄清楚如果我像这样调用 malloc 将分配多少内存
int *allocated_mem = malloc(2U * 1024U);
2 * 1024 == 2048有什么难点? 它们是无符号文本这一事实不会改变其值。
无符号标记器大小为 4 个字节。(原文如此)
你是对的。 所以2U
占用 4 个字节,1024U
占用 4 个字节,因为它们都是无符号整数。
我会为第一行分配 2 * 4 字节 = 8 的大小,对于第二行,例如 1024 * 4 字节 = 4096,但输出始终为"4"。
为什么该值会更改大小? 大小仅取决于类型。2U
的类型为unsigned int
,因此占用 4 个字节;同50U
,同1024U
。 它们都需要4 个字节。
您正在尝试将值 (2) 乘以类型的大小。 这是没有道理的。
有多大?
2U
和1024U
的大小相同,大小相当于一个unsigned
,通常为32位或4个"字节"。 类型的大小在整个给定平台中是相同的 - 它不会因为值而改变。
"我知道 U 字面意思是 c 中的值,值是一个无符号整数。" --> 好的,到目前为止足够接近了。
"无符号整数大小为 4 个字节。 合理的猜测,但 C 要求unsigned
至少为 16 位。 此外,U
使常量无符号,但这可能是unsigned
、unsigned long
、unsigned long long
,这取决于值和平台。
细节:在 C 中,2U
不是文字,而是常量。 C 具有字符串文本和复合文本。 文字可以获取其地址,但&2U
不是有效的 C。 其他语言称2U
为文字,并对其使用方式有其规则。
我的目标是弄清楚如果我像这样调用 malloc 将分配多少内存
int *allocated_mem = malloc(2U * 1024U);
相反,最好使用size_t
来调整大小,而不是unsigned
并检查分配。
size_t sz = 2U * 1024U;
int *allocated_mem = malloc(sz);
if (allocated_mem == NULL) allocated_mem = 0;
printf("Allocation size %zun", 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: %ldn", sizeof(1024U));
printf("Size of 1024U: %ldn", sizeof(2U));