首页上一页 1 下一页尾页 8 条记录 1/1页
给无符号整型 负数值 出现的疑问
发表在C语言图书答疑
2016-08-01
是否精华
是
否
版块置顶:
是
否
设置时间:
非永久
永久
起始时间:
结束时间:
是否扣分:
是
否
请问:以下两个程序(.c) %d 的输出值,为什么一个用 原值 ,一个用 补码 。
#include<stdio.h>
int main()
{
unsigned a,b;
a=-5;
b=-1;
printf("%d,%d\n",a,b);
printf("%u,%u\n",a,b);
return 0; //编译结果是 -5,-1
} 4294967291,4294967295
#include<stdio.h>
int main()
{
unsigned short a,b;
a=-5;
b=-1;
printf("%d,%d\n",a,b);
printf("%u,%u\n",a,b);
return 0; 编译结果是: 65531,65535
} 65531,65535
#include<stdio.h>
int main()
{
unsigned a,b;
a=-5;
b=-1;
printf("%d,%d\n",a,b);
printf("%u,%u\n",a,b);
return 0; //编译结果是 -5,-1
} 4294967291,4294967295
#include<stdio.h>
int main()
{
unsigned short a,b;
a=-5;
b=-1;
printf("%d,%d\n",a,b);
printf("%u,%u\n",a,b);
return 0; 编译结果是: 65531,65535
} 65531,65535
精彩评论 8
2016-08-02
地板
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
使用正确的输出方式, 结果就会相同了。
下面的 unsigned short 类型,正确的输出格式符中 %hu
short 则是 %hd
[/FIELDSET]
回复:
写错的目的,是想了解错误输入情况,电脑是怎么处理的
[/FIELDSET]
这个跟 数据存诸方式和 printf实格式有关,
无论正数,负数 在计算机中都是存的 补码。
例如 unsigned a = -5 : 计算机存的是 0xFFFFfffB;
显示出来是什么形式则跟printf的实现方式有关。如果你用 %d 输出。则是把这个补码当成一个有符号数的补码。
如果使用 %u 输出 则当成一个无符数的补码。
回复:
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
使用正确的输出方式, 结果就会相同了。
下面的 unsigned short 类型,正确的输出格式符中 %hu
short 则是 %hd
[/FIELDSET]
回复:
写错的目的,是想了解错误输入情况,电脑是怎么处理的
[/FIELDSET]
这个跟 数据存诸方式和 printf实格式有关,
无论正数,负数 在计算机中都是存的 补码。
例如 unsigned a = -5 : 计算机存的是 0xFFFFfffB;
显示出来是什么形式则跟printf的实现方式有关。如果你用 %d 输出。则是把这个补码当成一个有符号数的补码。
如果使用 %u 输出 则当成一个无符数的补码。
回复:
2016-08-02
4L
[FIELDSET][LEGEND]引自:3楼[/LEGEND]
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
使用正确的输出方式, 结果就会相同了。
下面的 unsigned short 类型,正确的输出格式符中 %hu
short 则是 %hd
[/FIELDSET]
回复:
写错的目的,是想了解错误输入情况,电脑是怎么处理的
[/FIELDSET]
这个跟 数据存诸方式和 printf实格式有关,
无论正数,负数 在计算机中都是存的 补码。
例如 unsigned a = -5 : 计算机存的是 0xFFFFfffB;
显示出来是什么形式则跟printf的实现方式有关。如果你用 %d 输出。则是把这个补码当成一个有符号数的补码。
如果使用 %u 输出 则当成一个无符数的补码。
回复:
[/FIELDSET]
回复:
这个用%d输出例子为什么是把补码当成无符号数的补码输出
#include<stdio.h>
int main()
{
unsigned short a=-5;
printf("%d\n",a);
return 0;
}
编译结果是: 65531
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
使用正确的输出方式, 结果就会相同了。
下面的 unsigned short 类型,正确的输出格式符中 %hu
short 则是 %hd
[/FIELDSET]
回复:
写错的目的,是想了解错误输入情况,电脑是怎么处理的
[/FIELDSET]
这个跟 数据存诸方式和 printf实格式有关,
无论正数,负数 在计算机中都是存的 补码。
例如 unsigned a = -5 : 计算机存的是 0xFFFFfffB;
显示出来是什么形式则跟printf的实现方式有关。如果你用 %d 输出。则是把这个补码当成一个有符号数的补码。
如果使用 %u 输出 则当成一个无符数的补码。
回复:
[/FIELDSET]
回复:
这个用%d输出例子为什么是把补码当成无符号数的补码输出
#include<stdio.h>
int main()
{
unsigned short a=-5;
printf("%d\n",a);
return 0;
}
编译结果是: 65531
2016-08-02
5L
[FIELDSET][LEGEND]引自:4楼[/LEGEND]
[FIELDSET][LEGEND]引自:3楼[/LEGEND]
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
使用正确的输出方式, 结果就会相同了。
下面的 unsigned short 类型,正确的输出格式符中 %hu
short 则是 %hd
[/FIELDSET]
回复:
写错的目的,是想了解错误输入情况,电脑是怎么处理的
[/FIELDSET]
这个跟 数据存诸方式和 printf实格式有关,
无论正数,负数 在计算机中都是存的 补码。
例如 unsigned a = -5 : 计算机存的是 0xFFFFfffB;
显示出来是什么形式则跟printf的实现方式有关。如果你用 %d 输出。则是把这个补码当成一个有符号数的补码。
如果使用 %u 输出 则当成一个无符数的补码。
回复:
[/FIELDSET]
回复:
这个用%d输出例子为什么是把补码当成无符号数的补码输出
#include<stdio.h>
int main()
{
unsigned short a=-5;
printf("%d\n",a);
return 0;
}
编译结果是: 65531
[/FIELDSET]
回复:
%d 把 a 强制转化为 32位int型。 原来的 0xFFFB(-5) => 0x0000FFFB(65531);
所以输出是这个结果。
[FIELDSET][LEGEND]引自:3楼[/LEGEND]
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
使用正确的输出方式, 结果就会相同了。
下面的 unsigned short 类型,正确的输出格式符中 %hu
short 则是 %hd
[/FIELDSET]
回复:
写错的目的,是想了解错误输入情况,电脑是怎么处理的
[/FIELDSET]
这个跟 数据存诸方式和 printf实格式有关,
无论正数,负数 在计算机中都是存的 补码。
例如 unsigned a = -5 : 计算机存的是 0xFFFFfffB;
显示出来是什么形式则跟printf的实现方式有关。如果你用 %d 输出。则是把这个补码当成一个有符号数的补码。
如果使用 %u 输出 则当成一个无符数的补码。
回复:
[/FIELDSET]
回复:
这个用%d输出例子为什么是把补码当成无符号数的补码输出
#include<stdio.h>
int main()
{
unsigned short a=-5;
printf("%d\n",a);
return 0;
}
编译结果是: 65531
[/FIELDSET]
回复:
%d 把 a 强制转化为 32位int型。 原来的 0xFFFB(-5) => 0x0000FFFB(65531);
所以输出是这个结果。
2016-08-02
6L
[FIELDSET][LEGEND]引自:5楼[/LEGEND]
[FIELDSET][LEGEND]引自:4楼[/LEGEND]
[FIELDSET][LEGEND]引自:3楼[/LEGEND]
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
使用正确的输出方式, 结果就会相同了。
下面的 unsigned short 类型,正确的输出格式符中 %hu
short 则是 %hd
[/FIELDSET]
回复:
写错的目的,是想了解错误输入情况,电脑是怎么处理的
[/FIELDSET]
这个跟 数据存诸方式和 printf实格式有关,
无论正数,负数 在计算机中都是存的 补码。
例如 unsigned a = -5 : 计算机存的是 0xFFFFfffB;
显示出来是什么形式则跟printf的实现方式有关。如果你用 %d 输出。则是把这个补码当成一个有符号数的补码。
如果使用 %u 输出 则当成一个无符数的补码。
回复:
[/FIELDSET]
回复:
这个用%d输出例子为什么是把补码当成无符号数的补码输出
#include<stdio.h>
int main()
{
unsigned short a=-5;
printf("%d\n",a);
return 0;
}
编译结果是: 65531
[/FIELDSET]
回复:
%d 把 a 强制转化为 32位int型。 原来的 0xFFFB(-5) => 0x0000FFFB(65531);
所以输出是这个结果。
[/FIELDSET]
回复:
printf第一个参数,里面是一系统的 %xx 这样的字符串, 这里就指定了后面对应的数据的显示方式。
[FIELDSET][LEGEND]引自:4楼[/LEGEND]
[FIELDSET][LEGEND]引自:3楼[/LEGEND]
[FIELDSET][LEGEND]引自:2楼[/LEGEND]
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
使用正确的输出方式, 结果就会相同了。
下面的 unsigned short 类型,正确的输出格式符中 %hu
short 则是 %hd
[/FIELDSET]
回复:
写错的目的,是想了解错误输入情况,电脑是怎么处理的
[/FIELDSET]
这个跟 数据存诸方式和 printf实格式有关,
无论正数,负数 在计算机中都是存的 补码。
例如 unsigned a = -5 : 计算机存的是 0xFFFFfffB;
显示出来是什么形式则跟printf的实现方式有关。如果你用 %d 输出。则是把这个补码当成一个有符号数的补码。
如果使用 %u 输出 则当成一个无符数的补码。
回复:
[/FIELDSET]
回复:
这个用%d输出例子为什么是把补码当成无符号数的补码输出
#include<stdio.h>
int main()
{
unsigned short a=-5;
printf("%d\n",a);
return 0;
}
编译结果是: 65531
[/FIELDSET]
回复:
%d 把 a 强制转化为 32位int型。 原来的 0xFFFB(-5) => 0x0000FFFB(65531);
所以输出是这个结果。
[/FIELDSET]
回复:
printf第一个参数,里面是一系统的 %xx 这样的字符串, 这里就指定了后面对应的数据的显示方式。