人们通常需要一次从内存中读取一个字节,就像下面这个简单的memcpy()
实现:
void *memcpy(void *dest, const void *src, size_t n)
{
char *from = (char *)src;
char *to = (char *)dest;
while(n--) *to++ = *from++;
return dest;
}
然而,我有时会看到人们显式地使用unsigned char *
而不仅仅是char *
。
当然,char
和unsigned char
可能并不相等。但是,当按字节读/写内存时,我使用char *
、signed char *
还是unsigned char *
会有区别吗?
更新:实际上,我完全知道c=200
可能会根据c
的类型而有不同的值。我在这里问的是,为什么人们在读取内存时有时会使用unsigned char *
而不仅仅是char *
,例如为了将uint32_t
存储在char[4]
中。
发布于 2011-12-05 22:15:52
这是C++与C的不同之处。一般而言,C只保证原始内存访问适用于unsigned char
;char
可能是有符号的,并且在1的补码或有符号幅度机器上,a -0可能会自动转换为+0,从而改变位模式。出于某种原因(我不知道),C++委员会将支持透明复制(位模式不变)的保证扩展到char
,以及unsigned char
;在1的补码或有符号幅度机器上,实现者别无选择,只能使普通的char
无符号,以避免这样的副作用。(当然,今天的大多数程序员都不关心这样的机器。)
无论如何,最终的结果是,来自C语言背景的老程序员(可能实际上在1的补码或有符号的数量机上工作过)将自动使用unsigned char
。通常的约定也是为字符数据唯一保留纯char
,为非常小的整数值保留signed char
,为原始内存保留unsigned char
,或者在打算进行位操作时保留bit。这样的规则允许读者区分不同的用途(如果它是宗教遵循的)。
发布于 2011-12-05 21:22:05
在您的代码示例中,这没有什么不同。但是,如果您希望显示/打印字节的值(因为最高位的解释有所不同),那么unsigned char
似乎更合适
发布于 2011-12-05 21:15:09
这取决于您要在char中存储的内容。有符号字符的范围从-127到127,而无符号字符的范围从0到255。
对于指针运算,这无关紧要。
https://stackoverflow.com/questions/8385824
复制相似问题