为什么memset采用int而不是char?

时间:2011-05-07 07:35:15

标签: c memset

为什么memsetint作为第二个参数而不是char,而wmemset采用wchar_t而不是long }或long long

3 个答案:

答案 0 :(得分:49)

memset早于(通过相当多的)函数原型添加到C.如果没有原型,你不能char传递给函数 - 当/如果你尝试的话,当你传递它时它会被提升为int,并且函数接收的是int

值得注意的是,在C中,(但不是在C ++中),像'a'这样的字符文字的类型为char - 它的类型为{{1所以你传递的内容通常无论如何都要以int开头。基本上它是以char开头并获得提升的唯一方法是传递int变量。

理论上,char可能会被修改,因此它会收到memset而不是char,但是不太可能有任何好处,并且可能会有一些相当不错的可能性代码或其他。有一个未知但可能相当高的成本,几乎没有任何实际利益的机会,我会说它被改变为在“苗条”和“无”之间接受int下降的可能性。

编辑(回复评论):char的{​​{1}}个最低有效位用作写入目标的值。

答案 1 :(得分:7)

可能与<ctypes.h>中的ints而不是chars中的函数相同的原因。

在大多数平台上,char太小而无法自动推入堆栈,因此通常会推送最接近机器字长的类型,即int

正如@ Gui13评论中指出的那样,这样做也可以提高效果。

答案 2 :(得分:-2)

请参阅fred的回答,这是出于性能原因。

在我这边,我尝试了这段代码:

#include <stdio.h>
#include <string.h>

int main (int argc, const char * argv[])
{
    char c = 0x00;

    printf("Before: c = 0x%02x\n", c);
    memset( &c, 0xABCDEF54, 1);
    printf("After:  c = 0x%02x\n", c);

    return 0;
}

它在64位Mac上给了我这个:

Before: c = 0x00
After:  c = 0x54

如您所见,只写入最后一个字节。我想这取决于架构(endianness)。