代码库使用数据类型,如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.为什么它显示那样?
2 回答
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
必须是无符号整数类型's exactly 8 bits wide. It'可能是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
类型需要使用二进制补码表示 .虽然
uint32_t
可能与unsigned int
相同,但您不应该假设这一点 . 当需要无符号整数类型's at least 16 bits wide, and that'是当前系统的"natural"大小时,请使用unsigned int
. 当需要一个正好为32位宽的无符号整数类型时,请使用uint32_t
.(不,
uint64
或uint64_t
与double
不同;double
是浮点类型 . )目前还不清楚你是如何计算尺寸的(“调试模式下的尺寸”?) .
使用
printf()
:通常你会使用
%zu
打印size_t
值(类型sizeof
返回),但是如果你're using a pre-C99 compiler like Visual Studio that won'工作 .您需要在代码中找到
typedef
语句,用于定义自定义名称,如uint8
等;那些不是标准的,所以这里的任何人都不知道它们是如何在你的代码中定义的 .新的C代码应该使用
<stdint.h>
,它会给你uint8_t
,依此类推 .