char作为低范围数值类型?

时间:2014-04-14 00:16:06

标签: c char integer

在C语言编程时,有时我的函数会接收数值,这些数值总是在0到4的范围内.32位int最多可以保存2,147,483,647。这是我没有使用的大量分配内存。我知道的最低范围类型是char(从0255,对吗?)。使用它来保存低范围数值是一个好习惯吗?还有其他类型我可以使用吗?

7 个答案:

答案 0 :(得分:4)

如果它是一个标量函数参数,它在传递给函数时肯定会在实践中被提升为至少32位类型,因此使用char将没有实际的区别。我认为为了提高可读性会更好,int是显而易见的"一般整数值"类型。

但是,如果您可能拥有大量值的数组,则使用char将使值能够更紧密地打包在内存中。如果你真的按下了内存,你可以通过每个值只使用3或4位来更紧凑地打包它们(最少3个,4个更好地对齐)。然而,处理效率肯定会降低。

答案 1 :(得分:4)

如果确实需要节省空间,则可以使用位域。但请注意,您可能需要更多周期才能访问数据。 (即使访问现代硬件上的字符可能需要比本机整数大小更多的周期)

(编辑以举例:

struct packed_values
{
     unsigned int val1       : 3; /* ranges from 0-7 */
     unsigned int val2       : 3;
     unsigned int val3       : 3; 
     unsigned int val4       : 3;
     unsigned int val5       : 3;
     unsigned int val6       : 3;
     unsigned int val7       : 3;
     unsigned int val8       : 3;
     unsigned int val9       : 3;
     unsigned int val10      : 3;
     unsigned int padding    : 2; // make this be 32bits
};

packed_value myval;
myval.val1 = 5;
myval.val2 = 6;
myval.val3 = 7;

答案 2 :(得分:3)

不要将char用于此“效率” - 这只会让人感到困惑/烦恼(比如我:-)。使用int表示一般数字整数。

为了精确控制,例如对于8位RGB像素的数组,请使用uint8_t

答案 3 :(得分:2)

用于传递值的类型几乎无关紧要,你应该使用字节对齐的类型,char对此很好(尽管在几乎任何数值运算后它都可能会被转换为int ,所以int可能更容易)。

将数据存储在数组中时,应考虑将数据打包为每个值2位。

答案 4 :(得分:1)

char非常适合保持低范围值。它提供了效率,尤其是当您拥有大量值时。没有什么比这更小,因为char是一个完整的字节,除非你决定通过分区来将多个值存储在一个变量中...祝你好运!

答案 5 :(得分:1)

char是一个窄整数类型。它可以是签名的也可以是未签名的。如果它是无符号的,则其范围至少为0到255;如果签名,其范围至少为-127至+127。 (是的,-127,不是-128;标准对于有符号整数不需要2&#s;补码)。

类型char,顾名思义,主要用于保存字符 - 但如果您愿意,可以使用它来保存小整数,特别是如果您知道它们只在范围内0到127.使用unsigned charsigned char可能更好。

但无论如何,相对于使用int,不要期望节省的空间是显着的。许多系统需要更多和更慢的代码才能对char值执行算术而不是int值 - 并且在大多数情况下,char值会隐式提升为int。如果需要存储大量的小整数值,则某些字符类型的数组是有意义的。对于单个变量,使用char而不是int不会节省太多,如果有的话。

您还应该记住,int仅保证至少为16位,而不是32位。(但是现在,在大多数系统上,它可能会是32位或更宽) #39;可能会使用,除非您正在进行嵌入式工作。)如果您需要特定的大小,<stdint.h>中定义了许多类型(实际上是typedef,现有类型的别名)。 / p>

答案 6 :(得分:1)

没有关于性能的C规范,因此任何答案都充其量只是一个指导原则并且需要进行性能分析。

一般

1)使用int(或unsigned)是最佳速度和最小代码大小。

2)使用最小整数类型charsigned charunsigned char),因为它们使用的内存空间最小。除了_Bool之外,没有任何单一类型更小,这对于0到4不起作用。如果您有许多这样的小对象要打包在一起,则位字段可能会更小。

当有大量数组许多复制或内存亲爱时,最好使用小整数类型/位字段。其他简单的代码应该占上风。


许多人都提到char假设:

1)签名或未签名。

2)最小宽度为8位,最小范围为0到255 -127到127.(不是-128)