32位系统中的字大小为4字节。 所以char a ='bcd';已验证。 4个ASCII字符可以容纳32位整数。
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 |
------------------------------------------------------------------------------
答案 0 :(得分:5)
"所以char a =' bcd&#39 ;;是有效的。" 不,它不是,至少不是你期望的意义(是的,'bcd'
是一个多字节字符常量,但那不是存储多个字符,如您所期望的那样,但是是一些实现定义的数字)。
char
包含单个字符,它总是一个字节长。写char a
会给你一个字节。您无法通过a
访问前后的字节。编译器还 not 需要在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字符可以容纳32位整数
但是char
不是32位整数。它通常是一个8位整数。您发布的文字是关于类似
int32_t a = 'bcd';
(或可能是uint32_t a
)。现在a
实际上是32位长,可以容纳32位信息。但正如你引用的文字已经说过,这很少有用,因为这种分配的结果完全取决于实现。