【问题标题】:Can the char type be categorized as an integer?char类型可以归类为整数吗?
【发布时间】:2012-07-25 04:38:59
【问题描述】:

刚才我读到“char 是 Java 中唯一的无符号整数原始类型”。 这是否意味着 char 是 Java 中的整数类型之一?

和C一样,最近读到C类型包括标量类型、函数类型、联合类型、聚合类型,标量类型包括指针类型和算术类型,然后算术类型包括整数类型和浮点类型,整数类型包括枚举类型和字符类型。

char 类型真的可以在 Java 和 C 中都归类为整数吗?

【问题讨论】:

  • char 在 java 中被定义为 UTF-16 字符,这意味着它是一个介于 0 和 65535 之间的 2 字节值。这可以很容易地解释为整数(数学概念,不是int)。 c 中的char 被定义为 0 到 255 之间的 1 字节字符。
  • @HansZ 尽管CHAR_BIT == 8 是迄今为止最常见的,但 C 标准允许更大的值。甚至还有一些使用 32 位 chars、iirc 的实现。
  • @DanielFischer Ansi C 标准 (C99) $2.2.4.2:* 不是位域(字节)的最小对象的最大位数 CHAR_BIT 8 * 带符号字符类型对象的最小值SCHAR_MIN -127 * 有符号字符类型对象的最大值 SCHAR_MAX +127 * 无符号字符类型对象的最大值 UCHAR_MAX 255
  • @HansZ "它们的实现定义值的大小(绝对值)应等于或大于所示值,且符号相同。"
  • @HansZ 给定值 8 是 CHAR_BIT最小值允许值。一个实现可能会赋予它更大的价值。

标签: java c char


【解决方案1】:

是的,char 在它出现的所有流行语言中都是一个整数类型。 “积分”意味着它的光谱是离散的,任何两个不同值之间的最小差异是1。与其他整数类型相比,所需的支持值范围通常非常小。计算机硬件传统上将整数视为基本数据类型;相比之下,算术浮点类型是一种更新且更复杂的添加。

【讨论】:

  • 如果T 类型的对象的值是整数,则类型T 是整数类型。
  • @ouah:嗯。 'a' 是整数吗? :-)
  • @KerrekSB 在 C 中,它甚至是 int
  • @KerrekSB (C99, 6.4.4.4p10) "整数字符常量的值包含映射到单字节执行字符的单个字符是被解释为整数的映射字符表示的数值。"我的定义没问题;)
  • 不,Pascal 中的 char 也是一种流行语言(虽然不像过去那样普遍),但它不是整数类型。您必须使用 ord() 和 chr() 在字符及其值之间进行转换
【解决方案2】:

类似于@aioobe 的回答

int n = 5;
char ch = (char) '0' + 5; // '5'

或者反过来

char ch = '9';
int i = ch - '0'; // 9

或不寻常的

char ch = 'a';
ch += 1; // 'b';

或奇数

char ch = '0';
ch *= 1.1; // '4' as (char) (48 * 1.1) == '4'

ch %= 16; // `\u0004`
int i = ch; // 4

顺便说一句:来自 String.hashCode()

// int h = 0;
char val[] = value;
int len = count;

for (int i = 0; i < len; i++) {
    h = 31*h + val[off++];
}

【讨论】:

    【解决方案3】:

    根据JavaPrimitive Data Types教程:

    char:char 数据类型是单个 16 位 Unicode 字符。它的最小值为“\u0000”(或 0),最大值为“\uffff”(或 65,535 包括在内)。

    所以是的,它是一个 16 位无符号整数。使用类型来表示数字还是字符取决于您...


    还要记住,虽然 char 类型在 Java 中保证为 16 位,但 C 施加的唯一限制是该类型必须至少为 8 位。根据this answer 的 C 规范参考:

    不是位域(字节)的最小对象的最大位数

    CHAR_BIT 8

    因此,C 中的 char 不一定代表与 Java 中的 char 相同的整数值范围。

    【讨论】:

      【解决方案4】:

      我不确定整数类型的正式定义,但简而言之,是的,char 在 Java 中是整数类型,因为它可以被视为表示整数。

      你可以这样做

      char c1 = 'a' + 'b';
      
      char c2 = 5;
      
      char c3 = c2 + 3;
      
      int i = c3;
      char c4 = (char) i;
      

      等等。

      【讨论】:

        【解决方案5】:

        在记忆中,基本上一切都是不可或缺的……但是是的。 char 是 C、C++ 和 Java 中的整数类型。

        【讨论】:

          【解决方案6】:

          Char 是 C 及其相关后代中的“整数数据类型”。根据 K&R Book,“根据定义,字符只是小整数”。它们用于存储“字符”数据。

          ASCII 表列出了 128 个字符,每个文本字符对应一个整数值。

          Char 数据类型为 1 字节(8 位)。因此,它们最多可以存储 2^8 = 256 个不同的整数。 (这 256 个不同的整数对应不同的 ASCII 或 UTF 字符。)

          例如:

          根据 ASCII 标准,字母“x”存储为 01111000(十进制 120)。

          例如,您可以在 char 变量中添加一个值,就像任何整数一样!

          int main()
          {
              char a='x';
              int b=3+a;
              printf("value is:\n%d",b);
              return 0;
           }
          

          输出:b=123(3 + 120 用于 char 'x')

          即字符只是数字(整数:0-256(无符号))。

          【讨论】:

            【解决方案7】:

            C 规范要求将 char 类型实现为 1 字节整数。其他类型的规格并不总是那么清楚。例如,最初的 Kernigan 和 Ritchie C 书说,就 shortlong 而言,在不同的实现中,你只能依赖于 >short 不超过 long

            【讨论】:

            • char 在 java 中是 UTF-16,这意味着它是一个两字节字符。 c 中的char 被定义为sizeof(char) 总是产生1,这意味着它必须是一个1 字节的值。
            • UTF-16 在一个字节为 8 位的机器上只有两个字节。字节取决于架构。
            【解决方案8】:

            是的,char 类型可以归类为整数:

            int i = 49;
            int k = 36;
            
            System.out.print((char)i + (char)k + "$"); //may expect 1$ but print: 85$
            

            【讨论】:

            • 除了 1$ 之外,因为 char 不能加起来
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-07
            • 1970-01-01
            • 2016-11-25
            相关资源
            最近更新 更多