32 位系统中的字大小为 4 字节。 所以 char a='bcd';已验证。 32 位整数可以容纳 4 个 ASCII 字符。
char a='bcd';
//output is d for this line
printf("%c\n",a);
//output is 'z' when i use *(&a-1) and '�'(is -67 when manipulated)
printf("%c\n",*(&a-1));
现在我只想知道什么&a-1 (this is not 'b')
会点吗?是最后一个内存地址吗?
还有一件事是将字符打包到 int
中的顺序是什么? .
------------------------------------------------------------------------------
| bits : _ _ _ _ _ _ _ 8 _ _ _ _ _ _ _ 16 _ _ _ _ _ _ _ 24 _ _ _ _ _ _ _ 32 |
| order : ? ? ? ? ? ? ? 8 ? ? ? ? ? ? ? 16 ? ? ? ? ? ? ? 24 ? ? ? ? ? ? ? 32 |
------------------------------------------------------------------------------
最佳答案
“所以 char a='bcd'; 是有效的。” 不,不是,至少不是您所期望的那样(是的,'bcd'
是一个多字节字符常量,但它不如您所期望的那样存储多个字符,而是一些实现定义的数字)。
一个char
包含一个单个字符,它总是一个字节长。编写 char a
可以让您使用一个字节。您无法通过a
访问该之前和之后的字节。如果编译器不想的话,它也不需要在 char
周围添加任何填充。由于文字 'bcd'
具有(至少在我的系统上)一个不适合 char
的值(在我的系统上为 6447972),因此您最终会得到一个具有实现定义值的一个字节 char
。即使 a
周围有填充字节,您也不能假设它们被写入。
printf("%c\n",*(&a-1));
调用未定义的行为,因为您不拥有该内存。这与任何类型的“字长”无关。
如果你想存储字符序列,请使用
const char *str = "Some text";
(或
char str[] = "Some text";
如果你想修改C中的序列)或
std::string str = "Some text";
在 C++ 中。
<小时/>好的,您的编辑使您所谈论的内容更加清晰。引用您发布的内容:
4 ASCII characters can fit in a 32 bit integer
但是 char
不是 32 位整数。它通常是一个 8 位整数。您发布的文字正在谈论类似的事情
int32_t a = 'bcd';
(或者可能是uint32_t a
)。现在a
实际上是32位长,可以保存32位信息。但正如您引用的文本已经说过的那样,这很少有用,因为此类分配的结果完全依赖于实现。
关于c++ - 对 char a ='abc' 感到困惑;行为C编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31358541/