【问题标题】:Any way to create a char of size 32 in ANSI c?有什么方法可以在 ANSI c 中创建大小为 32 的字符?
【发布时间】:2015-02-13 19:12:44
【问题描述】:

我知道 C++11 有一个 char32_t 类型,它是 4 个字节,我想知道是否可以在 C 中实现类似的东西。我正在编写的程序需要所有 char 数组都是 4 的倍数字节。

【问题讨论】:

  • longs 在 C 中是 32 位的。这个不能用吗?
  • @h7r 否。在 C 中,除了 char 是 8 位之外,关于位宽的保证很少,stdint.h 中的固定宽度类型是它们所宣传的. long 至少为 32 位,但可以更多。此外,根据系统的不同,longlong long 之类的内容可能不适合单个寄存器,因此涉及 32 位或 64 位变量的某些类型的操作可能必须在软件中执行,从而大大减慢了程序。不过是个好问题。 en.wikipedia.org/wiki/C_data_types
  • 它是 C。你可以以任何你喜欢的方式推送字节。问题在于库:像 printf() 和 strcpy() 这样的东西不知道如何处理 32 位字符,所以你必须自己重写所有这些。
  • @Dogbert 点。抛开性能问题不谈,正如你所说,long“至少”是 32 位,所以我的想法不适合吗?
  • 为什么不用int_least32_t

标签: c c89 char32-t


【解决方案1】:

您打算如何处理这些数据?您将只在 32 位变量中使用单个字节,还是在其中存储实际的 32 位数据?

一个简单的解决方案是创建自己的抽象数据类型,以便以后更改:

#include <stdint.h>
typedef int32_t mChar;
mChar myChar32Array[100]; // Allocates 100x32-bit values

不过,修补 char 相关数据类型存在一个重大缺陷:许多库和代码 sn-ps 假定在处理文本时 charchar。如果您计划使用字符串操作函数并希望它们能够跨多个系统工作,您总是将字符串声明为char 的数组,而不是signed charunsigned char。唯一应该使用 unsigned char 的情况是,如果您直接使用 8 位二进制数据并且不想处理符号扩展等意外的奇怪现象,如果您不小心,这会给您带来时髦的值.

【讨论】:

  • 我曾计划在 32 位变量中使用单个字节。所以使用你的mChar 我会做类似的事情:mchar chr = 'i'; 我正在使用的系统有一个约束,所有字符串都需要是 4 个字节的倍数,我认为声明一个类型是最好的方法它,而不是填充所有 char 数组。
  • "char32_t 是用于 32 位字符的无符号整数类型,与 uint_least32_t C11dr §7.28 的类型相同 2. 推荐 uint_least32_t 而不是 int32_t 以密切模仿操作的char32_t. - 或至少使用未签名的uint32_t.
【解决方案2】:

C11 标准确实支持 char32_t 以 UTF-32 编码的字符串,例如:

#include <uchar.h>

int main() {
    char32_t *str = U"Hello world";
}

程序编译干净,比如gcc -std=c11

【讨论】:

  • 我使用的是 2009 年的早期 C 编译器,所以这对我不起作用。不过,谢谢您的意见。
  • 这是哪个编译器?
  • 这是我在工作中使用的专有库...很多标准库都不允许使用(stdint.h 和 uchar.h 不可用)。
猜你喜欢
  • 1970-01-01
  • 2011-04-24
  • 2011-09-06
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多