我使用的代码使用的类型包括uint8
(1字节宽无符号整数)、uint16
(2字节宽无符号整数)、uint32
(4字节宽无符号整数)等。
我的问题是:
uint8
和char
的尺寸一样吗?uint16
和int
的尺寸一样吗?uint32
和long
的尺寸一样吗?uint64
和double
的尺寸一样吗?例如:
uint8 c[20];
这个不应该是20块吗?
我在中编写了一些代码:
#include <stdio.h>
#include <string.h>
typedef unsigned int uint32;
typedef unsigned int uint8;
int main()
{
double a = 1320.134;
uint32 b;
uint8 c[20];
b = (unsigned int)a;
c[3] = b;
printf("value is %d", c[3]);
return 1;
}
但在调试模式下,c
的大小为50。为什么会这样呢?
发布于 2014-04-03 16:16:52
uint8
、uint16
、uint32
和uint64
可能是微软特有的类型.
在1999年的标准中,C支持具有类似含义的标准类型,在<stdint.h>
中定义为:uint8_t
、uint16_t
、uint32_t
和uint64_t
。我假设特定于微软的类型也是类似定义的。微软确实支持<stdint.h>
,至少在Visual 2010的时候是这样,但是旧代码可能使用uint8
等。
预定义类型char
、short
、int
等的大小因C实现而异。C标准有一定的最低要求(char
至少为8位,short
和int
至少为16位,long
至少为32位,列表中的每种类型至少与前一种类型一样宽),但允许一些灵活性。例如,我见过int
为16位、32位或64位的系统。
char
几乎总是8位,但允许更宽。普通的char
可以是签名的,也可以是无签名的。
uint8_t
必须是完全8位宽的无符号整数类型。它很可能是用于unsigned char
的typedef,但是如果普通char
碰巧没有签名的话,它可能是普通char
的typedef。如果没有预定义的8位无符号类型,那么uint8_t
将完全不被定义.
类似地,每个uintN_t
类型都是一个无符号类型,宽度正好是N位。
此外,<stdint.h>
还定义了相应的有符号intN_t
类型,以及至少具有指定宽度的int_fastN_t
和int_leastN_t
类型。
[u]intN_t
类型保证没有填充位,因此每个类型的大小都是N位。有符号的intN_t
类型需要使用2‘s补码表示形式.
例如,尽管uint32_t
可能与unsigned int
相同,但您不应该假设这一点。如果需要至少16位宽的无符号整数类型,并且这是当前系统的“自然”大小,请使用unsigned int
。当您需要完全32位宽的无符号整数类型时,请使用uint32_t
。
(不,uint64
或uint64_t
与double
不一样;double
是浮点类型。)
发布于 2014-04-03 16:00:35
很不清楚您是如何计算大小的(“调试模式下的大小”?)。
使用printf()
printf("the size of c is %u\n", (unsigned int) sizeof c);
通常,您会用size_t
打印一个%zu
值(这是sizeof
返回的类型),但是如果您使用的是Visual这样的前C99编译器,那么它就不能工作。
您需要在代码中找到定义自定义名称(如typedef
等)的uint8
语句;这些都是不标准的,因此这里没有人知道它们是如何在代码中定义的。
新的C代码应该使用<stdint.h>
,这给您提供了uint8_t
等等。
https://stackoverflow.com/questions/22842707
复制相似问题