char,short,int,long,unsigned,signed

char, short, int, long, unsigned, signed。
6个关键字可以组合成8种整型类型。
signed char, signed short, signed int, signed long,
unsigned char, unsigned short, unsigned int, unsigned long。

一、如何使用char,short,int,long,unsigned,signed

1、signed和unsigned可以与char, short, int, long一起使用。
     char,short,int,long默认情况下是signed,带符号位的。

2、signed和unsigned也可以单独使用,这种情况下默认为int类型。

3、在XP 32位系统下,Microsoft Visual Stdio 2005 IDE下,各整型类型的长度是:
    sizeof(long) = 4;
    sizeof(int) = 4;
    sizeof(short) = 2;
    sizeof(char) = 1;

4、根据类型所占字节大小,可以分别求出某整型类型的范围。
     signed int  32bits(有符号位,二进制补码)
     故其范围是: [-2^(31), 2^(31) - 1]
     unsigned int 32bits(无符号位)
     范围是:[0, 2^(32) - 1]
     同理你可以递推出char,short,long的范围。

二、整型转换(1)

将整型类型中分成两组,一组是符号型,另一组是无符号。

1、 uy = ux
如果sizeof(ux) > sizeof(uy),则需要对ux的二进制补码进行左截取,再直接赋值。
如果sizeof(ux) = sizeof(uy),则直接赋值。
如果sizeof(ux) < sizeof(uy),则需要对ux的二进制补码进行左添加0,再直接赋值。

unsigned long ul = 0xFFFFFFF0;
unsigned int ui = 0xFFFFFFF0;
unsigned char uc = 0xF0;
unsigned short us;

us = ul;/*us = 0xFFF0 */
us = ui;/*us = 0xFFF0 */
us = uc;/*us = 0x00F0 */

2、uy = sx
如果sizeof(sx) > sizeof(uy), 则需要对sx的二进制补码进行左截取,再直接赋值。
如果sizeof(sx) = sizeof(uy), 则直接赋值。
如果sizeof(sx) < sizeof(uy), 则需要对sx的二进制补码进行左添加符号位,再直接赋值。

signed long sl = 0xFFFFFFF0;
signed int si = 0xFFFFFFF0;
signed short ss = 0xFFF0;
signed char sc = 0xF0;
unsigned short us;

us = sl; /*us = 0xFFF0*/
us = si; /*us = 0xFFF0*/
us = ss;/*us = 0xFFF0*/
us = sc;/*us = 0xFFF0*/

3、sy = ux
如果sizeof(ux) > sizeof(sy), 则需要对ux的二进制补码进行左截取,再直接赋值。
如果sizeof(ux) = sizeof(sy), 则直接赋值。
如果sizeof(ux) < sizeof(sy), 则需要对ux的二进制补码进行左添加0,再直接赋值。

unsigned long ul = 0xFFFFFFF0;
unsigned int ui = 0xFFFFFFF0;
unsigned short us = 0xFFF0;
unsigned char uc = 0xF0;
signed short ss;

ss = ul; /*ss = 0xFFF0 */
ss = ui; /*ss = 0xFFF0 */
ss = us;/*ss = 0xFFF0 */
ss = uc;/*ss = 0x00F0 */

4、sy = sx
如果sizeof(sx) > sizeof(sy), 则需要对sx的二进制补码进行左截取,再直接赋值。
如果sizeof(sx) = sizeof(sy), 则直接赋值。
如果sizeof(sx) < sizeof(sy), 则需要对sx的二进制补码进行左添加符号位,再直接赋值。

signed long sl = 0xFFFFFFF0;
signed int si = 0xFFFFFFF0;
signed char sc = 0xF0;
signed short ss;

ss = sl; /*ss = 0xFFF0 */
ss = si; /*ss = 0xFFF0*/
ss = sc;/*ss = 0xFFF0*/

二、整型转换(2)

执行赋值操作y_variable = x_variable

1、sizeof(x_variable) > sizeof(y_variable)
对x_variable的二进制补码进行左截取,然后直接赋值。
unsigned int ui = 0xFFFFFFF0;
signed int si = 0xFFFFFFFF0;
unsigned short us;
signed short ss;
us = ui; /*us = 0xFFF0*/
us = si; /*us = 0xFFF0*/
ss = ui; /*ss = 0xFFF0*/
ss = si; /*ss = 0xFFF0*/

2、sizeof(x_variable) = sizeof(y_variable)
直接赋值。
unsigned int ui = 0xFFFFFFF0;
signed int si;
si = ui; /*si = 0xFFFFFFF0*/

3、sizeof(x_variable) < sizeof(y_variable)
对x_variable的二进制补码进行左添加x_variable的符号位,然后直接赋值。
unsigned char uc = 0xF0;
signed char sc = 0xF0;
unsigned short us;
signed short ss;
us = uc;/*us = 0x00F0*/
us = sc;/*us = 0xFFF0*/
ss = uc;/*ss = 0x00F0*/
ss = sc;/*ss = 0xFFF0*/

三、算术类型转换
如果计算表达式中各个变量的类型不同,如何计算该表达式?
1、如果任何一个操作数为long double类型,则将另一个操作数转换为long double类型。
2、否则,如果任何一个操作数为double类型,则将另一个操作数转换为double类型。
3、否则,如果任何一个操作数为float类型,则将另一个操作数转换为float类型。
4、否则,如果任何一个操作数为unsigned long类型,则将另一个操作数转换为unsigned long。
5、否则,如果一个操作数为long类型且另一个操作数为unsigned int类型,则结果依赖于
long类型是否可以表示所有的unsigned int类型的值。如果可以,则将unsigned int 类型的操作数
转换为long类型;如果不可以,则将两个操作数都转换为unsigned long类型。
6、否则,如果一个操作数为long类型,则将另一个操作数转换为long类型。
7、否则,如果一个操作数为unsigned int 类型,则将另一个操作数转换为unsigned int类型。
8、否则,将两个操作数都转换为int类型。
注意1:在规则8中,将两个操作数都转换为int类型。如果操作数中有enum,char,short,则
一律将其转换为int类型,做整型运算。
注意2:在这里不包含强制类型转换。

本人现经营一个微信订阅号如下:欢迎大家关注,获取相关内容。
订阅号账号是:begginghard_zgh

订阅号名称是:读书笔记 By 张光辉


<think>好的,我现在需要详细回答用户关于C/C++中unsigned short int数据类型的问题。首先,我要确保自己对这个类型有全面的理解,然后结合提供的引用资料来支持回答。 首先,回顾一下C语言的基本数据类型。根据引用[1],C语言有六种基本数据类型:shortintlongchar、float、double。其中,shortintlong前面默认是signed的,但可以用unsigned修饰。而unsigned short int属于无符号整型家族的一部分。引用[3]提到,整型家族包括charshortintlong等,并且unsigned修饰符用于表示无符号数,即没有负数部分的数值。 接下来,需要明确unsigned short int的具体细节。根据标准,short int通常占2个字节(16位),所以unsigned short int的范围应该是0到65535。这点需要确认是否正确,可能不同编译器或平台会有差异,但大多数情况下是16位。引用[4]中的sizeof运算符可以用来确定具体的大小,所以建议用户使用sizeof来检查。 然后,考虑内存分配。unsigned short int作为无符号类型,不存储符号位,因此所有位都用于数值存储,这比同类型的有符号类型最大值高一倍。例如,signed short的范围是-32768到32767,而unsigned则是0到65535。这在处理不需要负数的场景下很有用,比如像素值或计数器。 另外,引用[2]提到可以使用typedef或using为类型创建别名,比如typedef unsigned short int ushort;,这可能提高代码可读性。这也是一个可以提及的编程技巧。 需要确保回答覆盖定义、内存大小、取值范围、使用场景以及注意事项。同时,结合提供的引用资料来支持各个点,例如引用[3]解释为什么char属于整型家族,这里可以类比说明unsigned short int的存储方式。 最后,生成相关问题时要围绕该类型展开,比如与其他类型的比较、使用场景、转换问题等。</think>### unsigned short int 数据类型详解 #### 1. **定义与基本特性** - **类型分类**:`unsigned short int` 属于C/C++整型家族中的无符号类型,由`unsigned`修饰符限定,表示仅存储非负整数[^1][^3]。 - **别名与简写**:可简写为`unsigned short`,部分编译器支持省略`int`关键字,两者等价[^3]。 #### 2. **内存大小与取值范围** - **内存占用**:通常占用 **2字节(16位)**,但具体大小依赖编译器和平台,可通过`sizeof(unsigned short)`验证[^4]。 - **取值范围**:$0 \text{ 至 } 2^{16}-1 = 0 \text{ 至 } 65535$[^3]。 #### 3. **使用场景** - **节省内存**:当数值范围不超过65535且无需负数时(如像素值、计数器),相比`int`更节省内存。 - **数据兼容性**:处理硬件寄存器、网络协议等需精确位宽的场景。 #### 4. **注意事项** - **溢出行为**:超出范围时按模运算回绕,例如`65535 + 1 = 0`。 - **类型转换**:与有符号类型混合运算时可能引发意外结果,建议显式转换。 --- #### 示例代码 ```c #include <stdio.h> int main() { unsigned short count = 65535; printf("最大值: %hu\n", count); // 输出65535 count += 1; printf("溢出后: %hu\n", count); // 输出0 return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值