代码库使用数据类型,如uint8 [1字节宽无符号整数],uint16 [2字节宽无符号整数],uint32 [4字节宽无符号整数]等。
问题: uint8和char一样? uint16与int相同? uint32和long一样? uint64与double ??
相同例如:uint8 c [20]; //那么sizeof(c)应该是20-不是吗? 我在visual studio中编写了一个小代码,如下所示:
#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.为什么它显示为那样??
答案 0 :(得分:13)
uint8
,uint16
,uint32
和uint64
可能是特定于Microsoft的类型。
从1999年标准开始,C支持具有相似含义的标准typedef,在<stdint.h>
:uint8_t
,uint16_t
,uint32_t
和uint64_t
中定义。我假设Microsoft特定类型的定义类似。 Microsoft确实支持<stdint.h>
,至少从Visual Studio 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
,这是&#34; natural&#34;当前系统的大小。当需要一个正好为32位宽的无符号整数类型时,请使用uint32_t
。
(不,uint64
或uint64_t
与double
不同; double
是浮点类型。)
答案 1 :(得分:3)
目前还不清楚你是如何计算尺寸的(“调试模式下的尺寸”?)。
使用printf()
:
printf("the size of c is %u\n", (unsigned int) sizeof c);
通常,您使用size_t
打印sizeof
值(类型%zu
返回),但是如果您使用的是像Visual Studio这样的前C99编译器不行。
您需要在代码中找到定义typedef
等自定义名称的uint8
语句;那些不是标准的,所以这里的任何人都不知道他们在你的代码中如何定义。
新的C代码应该使用<stdint.h>
,它会为您提供uint8_t
等等。