首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >-250个打印为6

-250个打印为6
EN

Stack Overflow用户
提问于 2011-08-22 00:51:33
回答 4查看 440关注 0票数 1

我无法识别以下程序是如何输出6和-250的。

代码语言:javascript
复制
#include<stdio.h>

int main()
{
    unsigned char p=-250;
    printf("%d",p);
    unsigned int p1=-250;
    printf("%d",p1);
    return 0;
}

作为一个无符号整数,它只需要输出正的values.How,p的值输出6?请帮我理解一下。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-22 00:55:26

printf不是类型安全的。它会打印您要求的任何内容,%d会显示"signed integer“。提供匹配类型的变量是您的责任。由于unsigned char只有8位宽,因此文字-250环绕为+6,当解释为带符号整数时,该值仍为+6。请注意,当通过可变参数传递时,charshort int (以及它们的已签名/未签名副本)都会被提升为int-types。

票数 5
EN

Stack Overflow用户

发布于 2011-08-22 01:33:37

默认情况下,-250integer numerals的类型为int。另外,负值存储在内存中的Two's complement form中。让我们计算二的补语形式为-250 (参见在wiki中制作二的补语形式段落):

  1. 25011111010 (前8位,前导0为omitted)
  2. Complement it,前导0为11111010 00000101 (前8位,前导1省略)
  3. Add 1,get 00000110 (前8位,前导1省略)

C中整数类型的类型转换规则告诉我们,我们应该删除左边的位,以获得8位字符。更多细节请看K&R A.6.2 (嗯,这是俄文版的,也许在原著中有另一个地方)。

所以unsigned char p恰好得到一个十进制的00000110值(十进制的6)。这就是为什么你会在输出中得到6。

我想,您现在明白为什么第二个printf中有-250了;)

票数 3
EN

Stack Overflow用户

发布于 2011-08-22 00:54:12

unsigned char可以只由数字组成,0..255数字是以256为模转换的。所以-250给了6一个角色

你不应该相信这种行为。你应该避免溢出。

p1中,它被强制转换为unsigned int,但在printf()中由于%d标识符而被打断为p1

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7139658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档