不时有人在SO上指出char(也就是"字节")不一定是8位.
似乎8位char几乎是通用的.我原本认为,对于主流平台,必须有一个8位char才能确保其在市场上的可行性.
现在和历史上,哪些平台使用的char不是8位,为什么它们与"普通"8位不同?
在编写代码时,考虑跨平台支持(例如,对于通用库而言),对于非8位平台,值得考虑的是什么char?
在过去,我遇到过一些char16位的ADI DSP .我认为DSP是一种利基架构.(然后,当时手工编写的汇编程序很容易击败可用的C编译器可以做的事情,所以我在该平台上没有真正获得C的经验.)
我一直认为:
char由一个字节表示,sizeof (char)总是1,chars 计)是RAM的字节数(+交换空间).但是现在我已经阅读了维基百科条目,我不再那么肯定了.
我的假设中有哪一个是错的?哪一个是危险的?
一些背景:
标题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) 刚才我读到"char是Java中唯一的无符号整数基本类型".这是否意味着char是Java中不可或缺的类型之一?
与C相同,最近我读过C类型包括标量类型,函数类型,联合类型,聚合类型,标量类型包括指针类型和算术类型,然后算术类型包括整数类型和浮点类型,整数类型包括枚举类型和字符类型.
char类型真的可以归类为Java和C中的整数吗?
我需要将四个带符号的字节打包成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时的位顺序.我不知道应该是什么样的正确行为.
谢谢
我最近(重新学习)较低级别的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字节字大小打印?
希望这很清楚,但如果需要澄清,请告诉我.
我正在考虑一个非常具体的(现在无用的)处理器,称为土星.
该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的含义?
嗨我对那些可以用ascii表表示的字符感兴趣.因此我正在做以下事情:
int t(char c) { return (int) c; }
...
if(!(t(d)>255)) { dostuff(); }
Run Code Online (Sandbox Code Playgroud)
所以我只对ascii表可表示的字符感兴趣,我认为在转换为int后应该小于256,我是对的吗?谢谢!
我总是看到人们写作 for(int ii = 0; ii < 50; ii ++)
但是对于数字<256,为什么不写人char ii而不是int ii因为它确定它是8位而不是更多?
我从书中听到过关于C/C++中整数类型的最小尺寸的介绍
下面的大小以字节为单位:
sizeof(char) >= 1sizeof(short) >= 2sizeof(long) >= 4sizeof(long long) >= 8但我无法在标准中找到这些保证.那么编译器是否需要保证在C++ 98/C++ 2003/C89/C99标准中定义?