当前位置: 首页 > 知识库问答 >
问题:

C/C中的固定长度数据类型

商柏
2023-03-14

我听说,int等数据类型的大小可能因平台而异。

我的第一个问题是:有人能举个例子,当程序假设一个int是4字节,但在不同的平台上是2字节时,出了什么问题?

我的另一个问题与此有关。我知道人们用一些typedef来解决这个问题,比如你有u8u16u32-这些变量保证是8位、16位、32位的,不管平台是什么——我的问题是,这通常是如何实现的?(我不是指stdintlibrary中的类型-我很好奇,怎么能强制某些类型总是说32位而不考虑平台??)

共有3个答案

裴鸿熙
2023-03-14

对于第一个问题:整数溢出。

对于第二个问题:例如,对于typedef一个无符号32位整数,在一个平台上,int是4个字节,使用:

 typedef unsigned int u32;

int为2字节而long为4字节的平台上:

typedef unsigned long u32;

这样,您只需要修改一个头文件,就可以使类型跨平台。

如果存在某些特定于平台的宏,则无需手动修改即可实现:

#if defined(PLAT1)
typedef unsigned int u32;
#elif defined(PLAT2)
typedef unsigned long u32;
#endif

如果支持C99stdint. h,则首选它。

乌学博
2023-03-14

在C标准的早期迭代中,您通常创建自己的typedef语句,以确保您获得(例如)16位类型,基于传递给编译器的字符串,例如:

gcc -DINT16_IS_LONG ...

如今(C99及以上版本),有一些特定类型,如uint16\u t,正好是16位宽的无符号整数。

如果您包含stdint. h,您将获得精确的位宽类型、至少那个宽度类型、给定最小宽度的最快类型等,如C99 7.18整数类型中所述

inttypes也非常有用。h为这些新类型的格式转换添加了一些其他简洁的功能(printfscanf格式字符串)。

周宸
2023-03-14

我知道人们用一些typedef来解决这个问题,比如你有像u8、u16、u32这样的变量——不管平台如何,这些变量都保证是8位、16位、32位

有些平台没有特定大小的类型(例如TI的28xxx,其中char的大小为16位)。在这种情况下,不可能有8位类型(除非你真的想要它,但这可能会导致性能下降)。

这通常是如何实现的?

通常使用typedef。c99(和C11)在标题中有这些typedef。所以,只要使用它们。

有人能举个例子,当程序假设int是4字节,但在不同的平台上是2字节时,会出现什么问题?

最好的例子是不同类型大小的系统之间的通信。将int数组从一个平台发送到另一个平台,其中两个平台上的sizeof(int)是不同的,必须非常小心。

此外,将int数组保存在32位平台上的二进制文件中,并在64位平台上重新解释它。

 类似资料:
  • 我需要生成一个固定长度的文本行: 我现在有的是: 这非常有用,因为生成了一个55个字符的固定长度的字符串。 例如,当可选值为空字符串时,就会出现问题,例如: 在string.format中有空字符串不会给出固定的长度,我仍然需要有30个字符的长度。 任何线索都非常感谢!! 谢谢

  • C 11首先引入了对通过用户定义的文本在C中定义新文本的支持。C 11或更高版本是否也为

  • 为什么浮点数据类型的精度不与其大小成正比增长?例如: 正如您所看到的,的精度大约是精度的两倍,这是有意义的,因为的大小是。 但这与双精度和长双精度的情况不同,长双精度的大小是128位,是64位双精度的两倍,但其精度只多出三位!! 我不知道浮点数是如何实现的,但从理性的角度来看,仅为三位精度使用64位内存是否有意义?! 我四处搜索,但没有找到一个简单明了的答案。如果有人能解释为什么长双精度只比双精度

  • 本文向大家介绍C/C++中获取数组长度的方法示例,包括了C/C++中获取数组长度的方法示例的使用技巧和注意事项,需要的朋友参考一下 学过C/C++的人都知道,在C/C++中并没有提供直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取其长度,那么对于其他类型的数组如何获取他们的长度呢? 其中一种方法是使用sizeof(array) / sizeof(array[0]),

  • 主要内容:值类型,引用类型,指针类型C# 语言中内置了一些基本的数据类型,数据类型用来指定程序中变量可以存储的数据的类型,C# 中的数据类型可以大致分为三类: 值类型(Value types); 引用类型(References types); 指针类型(Pointer types)。 值类型 C# 中的值类型是从 System.ValueType 类中派生出来的,对于值类型的变量我们可以直接为其分配一个具体的值。当声明一个值类型的变

  • 在用任何语言编写程序时,您需要使用各种变量来存储各种信息。 变量只是用于存储值的保留内存位置。 这意味着当您创建变量时,您在内存中保留了一些空间。 您可能希望存储各种数据类型的信息,如字符,宽字符,整数,浮点,双浮点,布尔等。根据变量的数据类型,操作系统分配内存并决定可以存储的内容。保留的记忆。 原始内置类型 C ++为程序员提供了丰富的内置和用户定义的数据类型。 下表列出了七种基本的C ++数据