数据类型的分类有哪些?字节大小为?有符号和无符号整型是什么?怎么计算?

1.整型

  •         整型就是整数,分为长整形和短整形,分别为32位长和16位长。表示的数的范围不同。若是无符号整型,就只能表示正整数了。有符号的整型,能表示正整数和负整数。
  • 整型 int:
    •         存储整数,最大整数2147483647=2^31-1
  • 长整型:long
    •         读写操作时,前面加上"l"->%ld,%lo,%lx
  • long long
    •         读写操作时,前面加上"ll"->%lld,%llo,%llx
  • 短整型:short
    •         读写操作时,前面加上"h"->%hd,%ho,%hx

2.实型

        实型实际就是浮点数,有小数部分,分为单精度浮点数和双精度浮点数,分别为32位长和64位长。表示的数的范围不同。

  • 单精度浮点数 float:
    •         输入scanf:%lf、%lg、%le
      •         输出print:%f、%g、%e
  • 双精度浮点数 double:
    •         %e
  • 扩展精度浮点数 long double:
    •         %lf
  • 字符类型
    •         char
      •         %c
      • 'a'97
        • 'A'65
        • '0'48
        • ' '32
        • 一道笔试题:

                  不能做switch()的参数类型是:实型

  • 补充一道代码,把小写字母转换为大写
  • if('a'<=ch&&ch<='z')
    {
        ch=ch-'a'+'A';
    }

    C语言提供toupper()函数来检查是否是小写字母

  • if(toupper(ch)=='A')....

  • 3.字符型

  • char类型
    •         字符型就是8位长整数,若是无符号字符型,就只能表示0~255之间的正整数。有符号的整型,能表示-128~127之间的正整数和负整数。ASCII字符可以用一个字符型表示。

4.枚举类型

5.十进制、八进制与十六进制

  • 十进制:
  •         0-9数字
  •         一定不能以0开头
    •         %u %d
  • 八进制:
    •         0-7数字
      •         必须0开头
        •         %o
    • 十六进制:
      •         0-9 a-f 
        •         以0x开头
          •         十六进制中字母既可以大写,也可以小写
            •         %x

6.有符号与无符号

有符号:第1位一定是用来存储符号,标记正负号。正数或零,左边位(符号位)=0

        负数:符号位=1。最大16位整数的二进制表示形式为0111 1111 1111 1111=32767=2^15-1。最大32位整数是0111 1111 1111 1111 1111 1111 1111 1111=2147483647=2^31-1

无符号:最左边一位是数值的一部分,而不是符号位。最大的16位无符号整数是65535=2^16-1,最大32为无符号整数是4294967295=2^32-1

默认的整数是有符号的,也就是左边位保留符号位。如果要告诉编译器无符号,需要在类型前面加上unsigned

计算:

表示区间:-128~127。如果>127的数字截取其二进制的后8位,并带入其符号位。

eg1:

char a=128;

printf(“%d”,a);

输出过程为:

128二进制->1000 0000

保留后8位:1000 0000

加上符号位:1->负数‘-’

最终结果:-1000 0000->‘-128’

eg2:

char a=129;

printf(“%d”,a);

输出过程为:

129二进制->1000 0001

保留后8位:1000 0001

加上符号位(默认第一位为符号位):1->负数‘-’

负数求解:取反+1:1111 1110 +1=1111 1111=1 0000 0000-1=128-1=127

最终结果:-127

无符号:unsigned。所有位都是数值位。表示区间:0~255

eg1:

unsigned char a=128;

printf(“%d”,a);

输出过程为:

128二进制->1000 0000

保留后8位:1000 0000

最终结果:1000 0000->‘128’

eg2:

unsigned char a=129;

printf(“%d”,a);

输出过程为:

129二进制->1000 0001

保留后8位:1000 0001

最终结果:1000 0001->‘127’

将有符号位转换为无符号:强制转换

char a=10;

b=(unsigned  char)a;

分类:

自定义数据类型:结构型,联合型和枚举型

内置数据类型:char,short,int....语言自带的数据类型

总结基本数据类型:

(1个字节8位)

字符型char:1字节

短整型short:2字节

整型int:4字节

long:4

long long:8字节

浮点型float:4字节

双精度浮点型double:8字节

long double:8 

指针类型:4字节

补充一个:x86平台(32),指针大小4字节;64平台指针大小为8字节

<think> 首先,用户的问题是:"我想查询C语言数据类型以及每种数据类型的位数"。我需要基于提供的引用信息来回答这个问题。 回顾引用内容: - 引用[1]:提到C语言数据类型丰富,但没有具体的数据类型或位数。 - 引用[2]:讨论了sizeof运算符的返回值,指出数据类型大小可能因系统而异,不利于可移植性。提到了unsigned int, unsigned long, unsigned long long,以及对应的printf占位符。 - 引用[3]:给出了一个例子,字符数据类型char,展示了如何声明使用。但没有具体位数。 - 引用[4]:比较JavaC语言数据类型,列出了C语言的整型类型:int, short int, long int, long long int, char, bool,并提到修饰符signedunsigned。 用户的问题焦点在"C语言数据类型及对应位数",所以我需要列出C语言的主要数据类型及其位大小。 关键点:C语言数据类型大小不是固定的;它依赖于系统编译器。引用[2]强调了这一点:sizeof的返回值因系统而异,影响可移植性。 标准C语言数据类型包括: - 基本类型:char, int, float, double等。 - 修饰符:signed, unsigned, short, long等。 从引用[4]中,我有:基本整型(int), 短整型(short int), 长整型(long int), 双长整型(long long int), 字符型(char), 布尔型(bool)。但bool在C99标准中引入。 位数问题:通常,C语言标准指定了最小范围,但不指定确切位数。例如: - char: 至少8位。 - short: 至少16位。 - int: 至少16位。 - long: 至少32位。 - long long: 至少64位(C99)。 我需要在自己的知识基础上补充这些信息,因为引用中没有提供具体位数。 结构化答案: 1. 说明C语言数据类型大小依赖于系统编译器。 2. 列出常见数据类型及其典型位数(基于通用系统如32位或64位)。 3. 使用示例或参考引用。 根据引用: - 引用[3]提到字符数据类型char,例如'a'。 - 引用[2]提到sizeof运算符占位符。 在回答中,我应该: - 使用行内数学表达式:例如,对于位数,使用$...$,例如$8$位。 - 独立公式单独成段。 - 中文回答。 - 生成相关问题。 - 在结尾添加引用标识。 回答结构: - 先解释C语言数据类型的多样性。 - 列出主要数据类型及其典型位数。 - 强调可移植性问题。 - 生成相关问题。 数据类型列表: - char: 通常8位。 - short int: 通常16位。 - int: 通常32位(在32位系统)或64位(在64位系统)?在大多数系统,int是32位。 - long int: 通常32位或64位,取决于系统。 - long long int: 通常是64位。 - float: 通常32位。 - double: 通常64位。 - bool: 在C99中,通常8位(但最小大小是1位,实际占用一个字节)。 从引用[4],有signedunsigned修饰符,但大小相同,只是范围不同。 现在,组织答案: 1. 引言:C语言数据类型丰富,但大小系统依赖。 2. 表格或列表形式展示常见数据类型典型位数。 3. 使用sizeof运算符检查大小。 4. 结束语。 5. 生成相关问题。 由于指令要求使用中文,并且格式正确。 </think> ### C语言数据类型及对应位数 在C语言中,数据类型大小(即位数)依赖于具体的系统编译器实现,不具有固定性。C标准(如C99C11)仅规定了数据类型的最小范围,而未指定确切位数。这可能导致可移植性问题(如在32位64位系统上,某些类型的大小可能不同)[^2]。因此,实际位数需要根据目标环境编译器来验证。常见的C语言数据类型主要包括基本类型(如整型、字符型、浮点型)及其修饰类型(如`signed`或`unsigned`)。以下基于典型的现代系统(如64位Linux/GCC编译器)列出主要数据类型及其典型位数:(注意:实际值可能因系统编译器而异,建议使用`sizeof`运算符在编程时动态获取大小。) #### 基本数据类型 | 数据类型 | 修饰符 | 典型位数(单位:位) | 最小范围(C标准规定) | 存储大小示例 | |----------|--------|--------------------|----------------------|-------------| | `char` | `signed` | $8$ | $-128$ 到 $127$ | 存储单个字符,如`'a'`[^3] | | `char` | `unsigned` | $8$ | $0$ 到 $255$ | 同上,用于无符号字符 | | `short int` | `signed` | $16$ | $-32768$ 到 $32767$ | 常用于节省内存的整型 | | `short int` | `unsigned` | $16$ | $0$ 到 $65535$ | 同上,无符号版本 | | `int` | `signed` | $32$(常见于32/64位系统) | $-32768$ 到 $32767$(最小) | 最常用的整型[^4] | | `int` | `unsigned` | $32$ | $0$ 到 $65535$(最小) | 用于非负整型 | | `long int` | `signed` | $32$(32位系统)或 $64$(64位系统) | $-2147483648$ 到 $2147483647$(最小) | 用于较大整数,可移植性差[^2] | | `long int` | `unsigned` | $32$ 或 $64$ | $0$ 到 $4294967295$(最小) | 同上,无符号 | | `long long int` | `signed` | $64$ | $-9223372036854775808$ 到 $9223372036854775807$(最小) | C99引入,用于极大整数[^4] | | `long long int` | `unsigned` | $64$ | $0$ 到 $18446744073709551615$(最小) | 同上,无符号 | | `float` | — | $32$ | 约 $10^{-38}$ 到 $10^{38}$(IEEE 754标准) | 单精度浮点数 | | `double` | — | $64$ | 约 $10^{-308}$ 到 $10^{308}$(IEEE 754标准) | 双精度浮点数 | | `_Bool` | — | $8$(通常) | $0$ 或 $1$(C99引入) | 布尔类型,最小大小为1位,但实际占用一个字节[^4] | #### 注意事项 - **系统依赖性**:数据类型大小不是固定的。例如,在32位系统上,`int` 通常为 $32$ 位;在64位系统上,`int` 通常仍为 $32$ 位,但 `long` 可能是 $64$ 位。 - **验证方法**:使用 `sizeof` 运算符在代码中获取实际大小。例如: ```c #include <stdio.h> int main() { printf("char size: %zu bits\n", sizeof(char) * 8); // %zu 用于 size_t 类型 printf("int size: %zu bits\n", sizeof(int) * 8); return 0; } ``` 运行此代码可输出当前系统的具体位数(单位为位,因为 `sizeof` 返回字节数,乘以 $8$ 得位数)[^2]。 - **可移植性问题**:`sizeof` 的返回值类型(如 `size_t`)在不同系统中可能为 `unsigned int`、`unsigned long` 或 `unsigned long long`,对应的 `printf` 占位符需匹配(如 `%u`、`%lu`、`%llu`),以避免错误[^2]。 - **数据类型丰富性**:C语言数据类型包括上述基本类型及其衍生类型(如数组、指针、结构体),这增强了其数据处理能力[^1],但具体实现细节需参考编译器文档。 如果您需要针对特定系统(如Windows/MSVC或Linux/GCC)的详细信息,建议查阅编译器手册或运行测试代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值