这与以下问题有关,
如何在C中声明32位整数
有人提到int在大多数平台上总是32位的。我很好奇这是不是真的。
你知道有什么不同尺寸的现代平台吗?忽略具有8位或16位架构的恐龙平台。
注意:我已经知道如何从另一个问题中声明32位整数。这个更像是一个调查,找出哪些平台(CPU/OS/编译器)支持其他大小的整数。
正如一些人所说,不保证"int"是32位的,如果您想使用特定大小的变量,特别是在编写涉及位操作的代码时,您应该使用c99规范规定的"标准整数类型"。
1 2 3 4
| int8_t
uint8_t
int32_t
uint32_t |
等。。。
它们通常采用[u]intn_t的形式,其中"u"指定您需要无符号数量,n是位数。
这些的正确typedef应该在stdint.h中的任何平台上都可用,使用这些typedef可以编写好的可移植代码:-)
- +1简单、干净、工作正常;)
- +1,继续。
- 很好的回答,只是不回答问题:)
- 当然,我刚刚检查过我,我认为这在windows上是坏的:blogs.msdn.com/oldnewthing/archive/2005/01/31/363790.aspx,但是听起来不太对,所以我要重新检查一下我兄弟的windows机器。
- 请记住,这些类型在C99中是可选的。如果一个实现提供了正确属性的基础类型,它必须给您相应的[u]intN_t类型,但是不能保证一个实现会有这样的类型。但是,它们可能很少,而且相距很远,因此如果您的编译器符合C99,那么这可能是最好的方法。
- @不过,C99(&167;7.18.1.1)中要求使用{,u}int_{least,fast}{8,16,32,16}_t类型。它们可以用于许多相同的目的——唯一需要注意的是,它们只能保证至少(而不是完全)8/16/32/64位宽。
- 很好,@craig,这个答案中明确列出的类型不是,但是您可以使用可能更宽的类型,忽略30秒中剩下的任何位。
"在大多数平台上总是32位的"-这段代码有什么问题?-)
C标准并没有规定许多整型的尺寸。它确实规定了相对大小,例如,sizeof(int) >= sizeof(short)等。它还要求最小范围,但允许多个编码方案(两个补码、一个补码和符号/幅度)。
如果需要特定大小的变量,则需要使用适合运行平台的变量,例如使用#ifdef的变量,例如:
1 2 3 4 5 6 7 8 9
| #ifdef LONG_IS_32BITS
typedef long int32;
#else
#ifdef INT_IS_32BITS
typedef int int32;
#else
#error No 32-bit data type available
#endif
#endif |
或者,C99及以上允许使用精确的宽度整数类型intN_t和uintN_t:
typedef名称intN_t指定一个带符号的整数类型,宽度为N,没有填充位,有一个二的补码表示。因此,int8_t表示宽度正好为8位的有符号整数类型。
typedef名称uintN_t指定宽度为N的无符号整数类型。因此,uint24_t表示宽度正好为24位的无符号整数类型。
这些类型是可选的。但是,如果一个实现提供宽度为8、16、32或64位的整数类型,没有填充位,并且(对于有符号的类型)有两个补码表示,则它应定义相应的typedef名称。
- 让我明白:依赖C或C++中内置变量的大小本质上是一个错误。
- C标准规定了最小范围(即最小尺寸)。int的最小范围是-32767到+32767,long的最小范围是-2147483647到+2147483647。
- (这意味着,如果您只需要一个可以存储32位整数范围的变量,请使用long或unsigned long—不需要预处理器进行处理)。
- 是的,这可以确保数据类型至少保存一个给定的值,但您可能需要一个32位的值(例如,对于二进制文件写入),而不是至少32位的值。这就是你需要预处理器的地方。
- 抱歉,来晚了,你的密码不正确吗?第二个typedef不是typedef int int32;?
- @贾斯汀,你可能迟到了,但在过去的三年里,你似乎是唯一一个被注意到的人。很好的接球,改为接球。
- @帕西亚布洛哦,太好了,我以为我在那儿疯了一秒钟。谢谢您!
- @CAF:尽管当一个int足够的时候,总是使用long似乎很愚蠢。我需要一个可以存储数字0到99999999的变量,当32位足够时,我不希望它是64位宽的(如longs有时是这样)。很奇怪的是,从一开始就没有intN_t类型的整数。他们意识到不同位宽的CPU将运行C软件,但他们不费心用一种可移植的方式来保证位宽30年?
此时此刻,大多数桌面和服务器平台都使用32位整数,甚至许多嵌入式平台(如手持机或x86)也使用32位int。要获得16位int,您必须获得非常小的空间:想想"Berkeley Mote"或一些较小的Atmel Atmega芯片。但他们在外面。
- 是的,唯一能回答这个问题的答案!但是,如果知道你从哪里得到了答案,以及使用32位的特定编译器/平台,或者只是不使用32位的编译器/平台,那就太好了。
不。小型嵌入式系统使用16位整数。
- 有趣的事实:一些TI DSP上的sizeof(int) == 1,例如c2000。char和int都有16位(当然,short也有)。
它很大程度上取决于您的编译器。有些在64位机器上将它们编译为64位,有些则将它们编译为32位。嵌入式系统本身就是一个特殊的蜡球。
最好的检查方法是:
注意,sizeof将打印出字节。执行sizeof(int)*CHAR_BIT以获取位。
用于打印各种类型的位数的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <limits.h>
#include <stdio.h>
int main (void) {
printf("short is %d bits
", CHAR_BIT * sizeof( short ) );
printf("int is %d bits
", CHAR_BIT * sizeof( int ) );
printf("long is %d bits
", CHAR_BIT * sizeof( long ) );
printf("long long is %d bits
", CHAR_BIT * sizeof(long long) );
return 0;
} |
- 这在许多方面都是错误的。首先,sizeof可以对类型进行操作,因此不需要randomint的操作。第二,CHAR_BITS不能保证是8。还有一些事情,但这些都是与问题相关的错误。
- 是的,一个字节中不总是8位
- @埃里克的埃多克斯1〔3〕。我在评论中把它拼错了。
- 也不能保证类型的底层表示中的每一位都是一个值位——您可能有溢出位(甚至填充位)之类的东西。
- %d是size_t的错误格式说明符。
TI仍在销售带有C55X DSP的OMAP板,主要用于视频解码。我相信为它提供的编译器有一个16位的整数。它不是恐龙(诺基亚770于2005年发布),尽管你可以得到32位的DSP。
您编写的大多数代码,都可以安全地假设它不会在DSP上运行。但也许不是全部。
大多数基于ARM的处理器都可以运行拇指代码,这是一种16位模式。其中包括迄今为止唯一传言的安卓笔记本电脑和最前沿的智能手机。
另外,一些图形计算器使用8位处理器,我也会称之为相当现代的。
- 您不能使用8位int实现一致的C,因此即使这些计算器是8位的,如果它们有C编译器,那么它必须使int至少为16位。
- 啊,没错。
- Thumb代码仍然使用32位int;16位方面只是编码指令的大小。
- 在ANSIC标准中,int和short int的最小可接受大小是16位,因此无法有8位。
如果您还对实际的最大/最小值感兴趣,而不是位的数量,limits.h包含了您想要知道的几乎所有内容。