Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C int32、int、int32\u t、int8和int8\u t之间的差异_C_Int_Declaration - Fatal编程技术网

C int32、int、int32\u t、int8和int8\u t之间的差异

C int32、int、int32\u t、int8和int8\u t之间的差异,c,int,declaration,C,Int,Declaration,我最近在一个C程序中遇到了数据类型int32\t。我知道它存储32位,但是int和int32是否也这样做 另外,我想在程序中使用char。我可以改用int8\t吗?有什么区别 总而言之:C中的int32、int、int32、int8和int8有什么区别?在int32和int32\t之间有什么区别(同样在int8和int8\t之间也有区别)。区别非常简单:C标准定义了int8\t和int32\t,但是没有定义任何名为int8或int32的东西——后者(如果它们存在的话)可能来自其他的头或库(很可能

我最近在一个C程序中遇到了数据类型
int32\t
。我知道它存储32位,但是
int
int32
是否也这样做

另外,我想在程序中使用
char
。我可以改用
int8\t
吗?有什么区别


总而言之:C中的int32、int、int32、int8和int8有什么区别?
int32
int32\t
之间有什么区别(同样在
int8
int8\t
之间也有区别)。区别非常简单:C标准定义了
int8\t
int32\t
,但是没有定义任何名为
int8
int32
的东西——后者(如果它们存在的话)可能来自其他的头或库(很可能在C99中添加
int8\t
int32\t
之前)

普通的
int
与其他的有点不同。其中
int8\u t
int32\u t
都有指定的大小,
int
可以是任何大小>=16位。在不同的时间,16位和32位都是相当常见的(对于64位实现,可能应该是64位)

另一方面,
int
保证出现在C的每个实现中,而
int8\u t
int32\u t
则不存在。不过,这对你来说是否重要,可能还有待商榷。如果在小型嵌入式系统和/或较旧的编译器上使用C,则可能会出现问题。如果您主要在桌面/服务器计算机上使用现代编译器,则可能不会


Oops--错过了关于
char
的部分。如果(且仅当)您希望整数类型的大小保证正好为8位,则应使用
int8\t
而不是char。如果要存储字符,可能需要使用
char
。它的大小可以变化(根据位数),但保证正好是一个字节。不过有一点奇怪:不能保证普通的
char
是有符号的还是无符号的(许多编译器可以根据编译时标志将其设置为有符号或无符号)。如果需要确保其为有符号或无符号,则需要明确指定。

数据类型是stdint.h标头中的typedef类型,而int是内置的基本数据类型。这使得_t仅在stdint.h存在时可用。另一方面,int保证存在。

请始终记住,如果没有明确指定,那么“size”是可变的,因此如果您声明

 int i = 10;
在某些系统上,编译器可能会生成16位整数,而在某些系统上,编译器可能会生成32位整数(或在较新的系统上生成64位整数)

在嵌入式环境中,这可能会导致奇怪的结果(尤其是在处理内存映射I/O或可能考虑一个简单的数组情况)时,因此强烈建议指定固定大小的变量。在遗留系统中,您可能会遇到

 typedef short INT16;
 typedef int INT32;
 typedef long INT64; 
从C99开始,设计者添加了stdint.h头文件,该文件基本上利用了类似的typedef

在基于windows的系统上,您可能会在stdin.h头文件中看到如下条目

 typedef signed char       int8_t;
 typedef signed short      int16_t;
 typedef signed int        int32_t;
 typedef unsigned char     uint8_t;

还有更多类似于最小宽度整数或精确宽度整数的类型,我认为探索stdint.h以更好地理解它并不是一件坏事。

@linuxfreak:not sure about
bool\t
——以前从未听说过。C标准将
\u Bool
定义为内置类型
bool
仅当您
#include
(作为扩展到
\u bool
的宏)时才定义。您说过“对于64位实现,(int)可能应该是64位”。实际上,int在所有常见的64位平台上都是32位的,包括Windows、Mac OS X、Linux和各种风格的UNIX。克雷/独角兽是个例外,但它们现在已经过时了。@SamWatkins:是的,这就是为什么我谨慎地说“应该是”,而不是“是”。该标准称其为“体系结构建议的自然大小”,这(IMO)意味着在64位处理器上,它实际上应该是64位的(尽管,不管好坏,你说得对,它通常不是)。从更实际的角度来看,在C89中的类型中有一个32位类型是非常方便的,如果int是64位,long也必须至少是64位,所以通常没有32位类型。@barlop:是的。(C和C++两个任务都规定了char的255个最小值,所以它至少需要8个比特,但可以更多)。我总是觉得一个字节正好是8个字节,UPW8位中的任何位置都不能使用_tone?@Deven为什么要使用_tone?@Deven来避免代码在某个地方工作,而不是在其他地方。您的代码有一个输入错误:
typedef short INT16,而不是
typedefs short INT16