不同类型的赋值问题(char类型的对象可以直接赋-2^7,而int类型的对象不可以直接赋-2^31)

自由-_-自在 2018-07-03 01:22:00
char类型的取值范围为[-128,127],该类型对象可以直接赋-2^7,而int类型的取值范围为[-2^31,2^31-1],但该类型对象不可以直接赋-2^31
...全文
115 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
_肆 2018-07-03
  • 打赏
  • 举报
回复
char的处理是当成int处理再截断的,所以char实际上是9位,符号位在前一位,int就不行了,符号位就是最前面那个
_肆 2018-07-03
  • 打赏
  • 举报
回复
如果看16进制的话,char -128的表示是0xffffff80 反码是0x0000007f 补码是0x00000080 ;这个逻辑可以证明-128*-1=128

但是看int -2147483648表示为0x80000000 反码是0x7fffffff 补码是0x80000000 ;这个逻辑说明-2147483648*-1=-2147483648,这就不对了啊

为了避免,所以int=-2147483648的表示方法可以是=-2147483647-1
自由-_-自在 2018-07-03
  • 打赏
  • 举报
回复
能否给出更具体的解释,还是不太明白。
我知道通过整型常量2147483648>2147483647,编译器判断其类型为unsigned int,因此对无符号类型应用一元减运算符报错。但按照相同的原因,难道不该对char类型的对象赋-128同样报错吗?
karlzpsong 2018-07-03
  • 打赏
  • 举报
回复
在1990版本(ISO C90)中,非固定十进制整数常量的类型是<$ c $的第一个c> int , long int 或 unsigned long int 代表。 (C90没有长长或 unsigned long long 类型)。

在1999和2011版本中,其类型是 int , long int , long long int ;

特定常数的类型(例如 2147483648 )将根据以下因素而有所不同:您正在使用的编译器的整数类型的范围。如果你的编译器的 long 类型恰好是32位,那么 2147483648 将是 long 如果你的编译器使用C90规则( long long 保证至少为64位)。编译器会警告你这个。

你可以添加后缀来指定常量的类型,但没有后缀。 int 。可以为 unsigned int , L 添加 U code> long , UL for unsigned long,等等。

请务必记住, -2147483648 是不是一个整数常数;而 2147483648 本身是一个整数常量, -2147483648 是一个表达式,对该常量应用一元减运算符。根据C90规则,如果常数是 unsigned long 类型,那么这是一个无符号一元减,在无符号算术规则下, code> 2147483648 。根据C99或C11规则, 2147483648 很可能是类型(签名) long long code> -2147483648 ,以及类型 long long 。

有时会看到使用( - 2147483647 - 1)的代码来避免此问题;给定一个32位 int , 2147483647 的类型为 int ,并且表达式的结果产生预期的 int 值没有溢出。

当然如果你的编译器有不同整数类型的大小,这可能变得更复杂。
自由-_-自在 2018-07-03
  • 打赏
  • 举报
回复
赋值操作:
char cA = -128;//OK
int iB = -2147483648;//error

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧