|
发表于 2023-10-18 11:01:23
|
显示全部楼层
本帖最后由 AFUL 于 2023-10-18 12:06 编辑
首先,纠正一点:unsigned short n = -1; // 输出是65535;
unsigned short n = -2; // 输出是65534;
然后,我再详细说明一下,这儿同时参考short类型。我们用0000,0000,0000,0000(16个0表示16位都是0)。
那么,
0000,0000,0000,0000这个二进制在short类型和unsigned short类型中都表示0,
同理,
0000,0000,0000,0001这个二进制在short类型和unsigned short类型中都表示1,
以此类推,
0111,1111,1111,1111这个二进制在short类型和unsigned short类型中都表示32767。
但是,
第一位是0在short类型中表示非负数,在unsigned short类型中一直是非负数,所以下一个二进制,
1000,0000,0000,0000这个二进制在short类型中表示-32768和unsigned short类型中都表示32768,
进而,
1000,0000,0000,0001这个二进制在short类型中表示-32767,在unsigned short类型中都表示32769,
以此类推,
1111,1111,1111,1111这个二进制在short类型中表示-1=-32768+32767,在unsigned short类型中都表示65535。(这个就是为什么赋值-1最后会显示65535)
实际上,更进一步,如果赋值65536,最后会显示0,
这是因为65536的二进制就是
1,0000,0000,0000,0000,而short这种类型只选择后面16位,所以最后short和unsigned short类型都显示0。
以此类推,
1,0000,0000,0000,0001,就是65537,最后short和unsigned short类型都显示1。
#include <stdio.h>
#include <stdlib.h>
int main() {
// 0b数字,表示数字是二进制
char s[32] = {0};
int a = 0b00000000000000000000000000000000; // int类型32位, 最高位是符号位
sprintf(s, "%b", a);
printf("二进制: %s\n", s);
short b = 0b0000000000000000; // short类型16位, 最高位是符号位
unsigned short c = b; // unsigned short类型16位, 最高位不是符号位
printf("int: %d\nshort: %d\nunsigned short: %d\n", a, b, c);
printf("------------------------------\n");
a = 0b00000000000000000000000000000001; // int类型32位, 最高位是符号位
sprintf(s, "%b", a);
printf("二进制: %s\n", s);
b = 0b0000000000000001; // short类型16位, 最高位是符号位
c = b; // unsigned short类型16位, 最高位不是符号位
printf("int: %d\nshort: %d\nunsigned short: %d\n", a, b, c);
printf("------------------------------\n");
a = 0b00000000000000000111111111111111; // int类型32位, 最高位是符号位
sprintf(s, "%b", a);
printf("二进制: %s\n", s);
b = 0b0111111111111111; // short类型16位, 最高位是符号位
c = b; // unsigned short类型16位, 最高位不是符号位
printf("int: %d\nshort: %d\nunsigned short: %d\n", a, b, c);
printf("------------------------------\n");
a = 0b00000000000000001000000000000000; // int类型32位, 最高位是符号位
sprintf(s, "%b", a);
printf("二进制: %s\n", s);
b = 0b1000000000000000; // short类型16位, 最高位是符号位
c = b; // unsigned short类型16位, 最高位不是符号位
printf("int: %d\nshort: %d\nunsigned short: %d\n", a, b, c);
printf("------------------------------\n");
a = 0b00000000000000001111111111111111; // int类型32位, 最高位是符号位
sprintf(s, "%b", a);
printf("二进制: %s\n", s);
b = 0b1111111111111111; // short类型16位, 最高位是符号位
c = b; // unsigned short类型16位, 最高位不是符号位
printf("int: %d\nshort: %d\nunsigned short: %d\n", a, b, c);
printf("------------------------------\n");
a = 0b00000000000000010000000000000000; // int类型32位, 最高位是符号位
sprintf(s, "%b", a);
printf("二进制: %s\n", s);
b = 0b0000000000000000; // short类型16位, 最高位是符号位
c = b; // unsigned short类型16位, 最高位不是符号位
printf("int: %d\nshort: %d\nunsigned short: %d\n", a, b, c);
printf("------------------------------\n");
a = 0b00000000000000010000000000000001; // int类型32位, 最高位是符号位
sprintf(s, "%b", a);
printf("二进制: %s\n", s);
b = 0b0000000000000001; // short类型16位, 最高位是符号位
c = b; // unsigned short类型16位, 最高位不是符号位
printf("int: %d\nshort: %d\nunsigned short: %d\n", a, b, c);
return 0;
}
输出:二进制: 0
int: 0
short: 0
unsigned short: 0
------------------------------
二进制: 1
int: 1
short: 1
unsigned short: 1
------------------------------
二进制: 111111111111111
int: 32767
short: 32767
unsigned short: 32767
------------------------------
二进制: 1000000000000000
int: 32768
short: -32768
unsigned short: 32768
------------------------------
二进制: 1111111111111111
int: 65535
short: -1
unsigned short: 65535
------------------------------
二进制: 10000000000000000
int: 65536
short: 0
unsigned short: 0
------------------------------
二进制: 10000000000000001
int: 65537
short: 1
unsigned short: 1
|
|