相关疑难解决方法(0)

什么平台有8位字符以外的东西?

不时有人在SO上指出char(也就是"字节")不一定是8位.

似乎8位char几乎是通用的.我原本认为,对于主流平台,必须有一个8位char才能确保其在市场上的可行性.

现在和历史上,哪些平台使用的char不是8位,为什么它们与"普通"8位不同?

在编写代码时,考虑跨平台支持(例如,对于通用库而言),对于非8位平台,值得考虑的是什么char

在过去,我遇到过一些char16位的ADI DSP .我认为DSP是一种利基架构.(然后,当时手工编写的汇编程序很容易击败可用的C编译器可以做的事情,所以我在该平台上没有真正获得C的经验.)

c c++ cross-platform

133
推荐指数
8
解决办法
2万
查看次数

`char`总是总是有8位吗?

我一直认为:

  1. a char由一个字节表示,
  2. 一个字节总是可以指望有8位,
  3. sizeof (char)总是1,
  4. 并且我可以分配的最大理论内存量(以chars 计)是RAM的字节数(+交换空间).

但是现在我已经阅读了维基百科条目,我不再那么肯定了.

我的假设中有哪一个是错的?哪一个是危险的?

c memory

41
推荐指数
4
解决办法
1万
查看次数

如何在C中创建3位变量作为数据类型?

我可以typedef charCHAR1其是8位.但是如何将3位变量作为数据类型?

c

6
推荐指数
1
解决办法
2828
查看次数

在C89中是否有任何成熟/标准化的方法来使用固定宽度的整数?

一些背景:

标题stdint.h 是自C99以来C标准的一部分.它包括typedef,确保为8,16,32和64位长整数,包括有符号和无符号.但是,此标头不是C89标准的一部分,我还没有找到任何直接的方法来确保我的数据类型具有已知长度.

了解实际主题

下面的代码是SQLite(用C89编写)如何定义64位整数,但我觉得它并不令人信服.也就是说,我认为它无处不在.最糟糕的是,它可能会无声地失败:

/*
** CAPI3REF: 64-Bit Integer Types
** KEYWORDS: sqlite_int64 sqlite_uint64
**
** Because there is no cross-platform way to specify 64-bit integer types
** SQLite includes typedefs for 64-bit signed and unsigned integers.
*/
#ifdef SQLITE_INT64_TYPE
  typedef SQLITE_INT64_TYPE sqlite_int64;
  typedef unsigned SQLITE_INT64_TYPE sqlite_uint64;
#elif defined(_MSC_VER) || defined(__BORLANDC__)
  typedef __int64 sqlite_int64;
  typedef unsigned __int64 sqlite_uint64;
#else
  typedef long long int sqlite_int64;
  typedef unsigned long long int sqlite_uint64;
#endif
typedef sqlite_int64 sqlite3_int64; …
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation c89 ansi-c

6
推荐指数
1
解决办法
227
查看次数

您如何计算浮点数中设置的位数?

如何使用C函数计算浮点数中设置的位数?

c floating-point

5
推荐指数
2
解决办法
3618
查看次数

char类型可以归类为整数吗?

刚才我读到"char是Java中唯一的无符号整数基本类型".这是否意味着char是Java中不可或缺的类型之一?

与C相同,最近我读过C类型包括标量类型,函数类型,联合类型,聚合类型,标量类型包括指针类型和算术类型,然后算术类型包括整数类型和浮点类型,整数类型包括枚举类型和字符类型.

char类型真的可以归类为Java和C中的整数吗?

c java char

5
推荐指数
3
解决办法
1万
查看次数

C/C++将signed char打包成int

我需要将四个带符号的字节打包成32位整数类型.这就是我的目标:

int32_t byte(int8_t c) { return (unsigned char)c; }

int pack(char c0, char c1, ...) {
  return byte(c0) | byte(c1) << 8 | ...;
}
Run Code Online (Sandbox Code Playgroud)

这是一个很好的解决方案?它是便携式的(不是通信意义上的)吗?是否有现成的解决方案,或许可以提升?

问题我最关心的是将负位从char转换为int时的位顺序.我不知道应该是什么样的正确行为.

谢谢

c c++ signed byte packing

4
推荐指数
2
解决办法
1万
查看次数

为什么64位Ubuntu中的8字节数组(C)占用16个字节?

我最近(重新学习)较低级别的CS材料,我一直在探索缓冲区溢出.我创建了一个具有8字节数组的基本C程序char buffer[8];.然后我使用GDB来探索和反汇编程序并逐步执行它.我在64位版本的Ubuntu上,我注意到我的8字节字符数组实际上在内存中以16字节表示 - 高阶位都是0.

例如,而不是0xDEADBEEF 0x12345678像我期望的那样代表8字节数组,它实际上就像是0x00000000 0xDEADBEEF 0x00000000 0x12345678.

我做了一些谷歌搜索,并能够让GCC编译我的程序作为32位程序(使用-m32标志) - 这导致预期的8字节正常.

我只是在寻找一个明确的解释,为什么8字节字符数组在64位系统上以16字节表示.是因为最小字长/可寻址单位是16字节(64位)而GDB只是基于8字节字大小打印?

希望这很清楚,但如果需要澄清,请告诉我.

c 64-bit byte 32bit-64bit

3
推荐指数
1
解决办法
1151
查看次数

CHAR_BIT = 4是C标准授权的可能值吗?

我正在考虑一个非常具体的(现在无用的)处理器,称为土星.

该CPU的一个奇怪特性是它的元素单位是半字节(4位),而不是字节(8位).它不只是化妆品,任何指针值都以半字节表示.

有一次尝试为土星创建一个C编译器:hp48xgcc

看一下它的文档,我注意到它的基本类型遵循通常的GCC约定,使用char 8位.此时,我想知道:CHAR_BIT是否有意提供元素单元的大小?GCC自己的文档似乎暗示了这一点:

You can compute the number of bits in any data type like this:
      sizeof (type) * CHAR_BIT
Run Code Online (Sandbox Code Playgroud)

在这种情况下,考虑到Saturn架构,最好让CHAR_BIT = 4

或者我是否误解了CHAR_BIT的含义?

c

3
推荐指数
2
解决办法
371
查看次数

ansi-c将char转换为int,由ascii表示

嗨我对那些可以用ascii表表示的字符感兴趣.因此我正在做以下事情:

       int t(char c) { return (int) c; }
       ...
       if(!(t(d)>255)) { dostuff(); }
Run Code Online (Sandbox Code Playgroud)

所以我只对ascii表可表示的字符感兴趣,我认为在转换为int后应该小于256,我是对的吗?谢谢!

c

0
推荐指数
2
解决办法
3275
查看次数

for(int ii或for(char ii in C?

我总是看到人们写作 for(int ii = 0; ii < 50; ii ++)

但是对于数字<256,为什么不写人char ii而不是int ii因为它确定它是8位而不是更多?

c int char

0
推荐指数
1
解决办法
388
查看次数

C++ sizeof整数类型

我从书中听到过关于C/C++中整数类型的最小尺寸的介绍

下面的大小以字节为单位:

  • sizeof(char) >= 1
  • sizeof(short) >= 2
  • sizeof(long) >= 4
  • sizeof(long long) >= 8

但我无法在标准中找到这些保证.那么编译器是否需要保证在C++ 98/C++ 2003/C89/C99标准中定义?

c++

0
推荐指数
1
解决办法
340
查看次数