首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >按字节读取内存:"signed char *“vs "unsigned char *”

按字节读取内存:"signed char *“vs "unsigned char *”
EN

Stack Overflow用户
提问于 2011-12-05 21:09:46
回答 4查看 6.9K关注 0票数 18

人们通常需要一次从内存中读取一个字节,就像下面这个简单的memcpy()实现:

代码语言:javascript
复制
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 *

当然,charunsigned char可能并不相等。但是,当按字节读/写内存时,我使用char *signed char *还是unsigned char *会有区别吗?

更新:实际上,我完全知道c=200可能会根据c的类型而有不同的值。我在这里问的是,为什么人们在读取内存时有时会使用unsigned char *而不仅仅是char *,例如为了将uint32_t存储在char[4]中。

EN

回答 4

Stack Overflow用户

发布于 2011-12-05 22:15:52

这是C++与C的不同之处。一般而言,C只保证原始内存访问适用于unsigned charchar可能是有符号的,并且在1的补码或有符号幅度机器上,a -0可能会自动转换为+0,从而改变位模式。出于某种原因(我不知道),C++委员会将支持透明复制(位模式不变)的保证扩展到char,以及unsigned char;在1的补码或有符号幅度机器上,实现者别无选择,只能使普通的char无符号,以避免这样的副作用。(当然,今天的大多数程序员都不关心这样的机器。)

无论如何,最终的结果是,来自C语言背景的老程序员(可能实际上在1的补码或有符号的数量机上工作过)将自动使用unsigned char。通常的约定也是为字符数据唯一保留纯char,为非常小的整数值保留signed char,为原始内存保留unsigned char,或者在打算进行位操作时保留bit。这样的规则允许读者区分不同的用途(如果它是宗教遵循的)。

票数 14
EN

Stack Overflow用户

发布于 2011-12-05 21:22:05

在您的代码示例中,这没有什么不同。但是,如果您希望显示/打印字节的值(因为最高位的解释有所不同),那么unsigned char似乎更合适

票数 2
EN

Stack Overflow用户

发布于 2011-12-05 21:15:09

这取决于您要在char中存储的内容。有符号字符的范围从-127到127,而无符号字符的范围从0到255。

对于指针运算,这无关紧要。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8385824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档