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

Meh*_*dad 48 c memset

为什么memset采取int作为第二个参数,而不是一个char,而wmemset需要wchar_t的,而不是像longlong long

Jer*_*fin 51

memset早期(通过相当多的)将函数原型添加到C中.如果没有原型,则无法char函数传递给函数 - 当您尝试时,它会int在您通过它时被提升为什么,以及功能接收是一个int.

另外值得一提的是,C,字符文字喜欢'a'具有类型char-它有一个类型int,所以你通过什么会通常开始作为一种int反正.基本上,它作为char启动并获得提升的唯一方法是传递char变量.

从理论上讲,memset可能会被修改,因此它会收到一个char而不是一个int,但不太可能有任何好处,并且可能会破坏一些旧代码或其他代码.有一个未知但可能相当高的成本,几乎没有任何实际利益的机会,我会说它被改变的可能性char在"苗条"和"无"之间的线上得到了一个堕落.

编辑(响应注释):将CHAR_BIT最低有效位int用作写入目标的值.

  • 是的 - 在C89标准化期间添加了原型.在此之前,只有函数声明,它指定了返回类型,但没有指定参数的数量或类型. (5认同)
  • 等等,有没有函数原型的C版本?!= O (4认同)
  • 另外,`memset`根据定义*不使用值的'CHAR_BIT`最低有效位.它的定义是将值转换为`unsigned char`,它在2的补码表示上相同,但在其他(非常罕见的)实现上并没有那么多. (3认同)
  • 对于破坏旧代码的一个例子,如果`memset`突然接受了`char`,那么代码遵循通常传递`(unsigned char)的惯用语some_int`将变得非严格一致,因为它不适用于(非常罕见的实现,`char`被签名,大于`CHAR_MAX`的值不会像你希望的那样转换成`char`. (2认同)
  • 我使用 C++ 太久了,我忘记了 C 中的“a”是“int”而不是“char”。 (2认同)

Fré*_*idi 7

可能与<ctypes.h>采取ints和不采取功能的原因相同chars.

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

正如@ Gui13评论中指出的那样,这样做也会提高性能.

  • `<ctype.h>`中的函数采用`int`s,原因与`getc`,`fgetc`等,*return*`int`相同,以适应`EOF`,需要区分来自`char`(或`signed char`或`unsigned char`)的任何值. (3认同)