我使用的代码使用的类型包括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
复制相似问题