【问题标题】:Storing Variable in C在 C 中存储变量
【发布时间】:2012-09-15 07:52:25
【问题描述】:

我在 C 中的基本概念方面遇到了一些挑战。非常需要帮助。 我继续用代码的解释以及我想在那里提出的问题对代码进行注释。

void main (void)
{
  printf("%x", (unsigned)((char) (0x0FF))); //I want to store just 0xFF;
  /* Purpose of the next if-statement is to check if the unsigned char which is 255
   * be the same as the unsigned int which is also 255. How come the console doesn't print
   * out "sup"? Ideally it is supposed to print "sup" since 0xFF==0x000000FF.
   */
  if(((unsigned)(char) (0x0FF))==((int)(0x000000FF))) 
     printf("%s","sup");
}

感谢您的帮助。

【问题讨论】:

  • 基本概念 #1:main() 应该返回 int。
  • 这里的问题似乎有些混乱。你没有变量。
  • @stefan: unsigned == unsigned int
  • 由于此代码中没有变量并且没有存储任何内容,那么是的,您在真正的基本概念方面遇到了问题。

标签: c variables types char int


【解决方案1】:

你的括号弄错了,

if(((unsigned)(char) (0x0FF))==((int)(0x000000FF))) 

对左边的操作数执行两次强制转换,首先是char,通常(1)导致-1,然后将该值强制转换为unsigned int,通常(2 ) 得到 2^32-1 = 4294967295。

(1) 如果char 是有符号的,8 位宽,使用二进制补码并且只取最低有效字节来完成转换,就像大多数托管的情况一样实施。如果char 是无符号的,或者宽于八位,则结果将为 255。

(2) 如果转换为 char 的结果为 -1 且 unsigned int 为 32 位宽。

【讨论】:

  • “正确”版本:(unsigned char)0xFF
  • 为什么 (char) 0x0FF 等于 -1?
  • @1'' 通常。 0xFF 是-1 的八位二进制补码表示,在大多数机器上,转换为更小的整数类型只是通过适当的重新解释截断位模式。但是将超出范围的值转换为有符号整数类型是实现定义的,因此结果可能有所不同(在符号和大小机器上,-127 可能是候选者,在补码机器上 -0)。
  • '通常导致 -1" -- 更准确和更准确地说,如果 char 在实现中被签名,它会导致 -1。有些实现中 char 是无符号的,如果一个人花费了大部分使用这种实现的时间,那么(char)0xFF“通常”将不等于-1。
  • '你把括号弄错了'——它们的数量也比必要的多,而且它们不利于可读性。 if( (unsigned char)0x0FF == (int)0x000000FF ) 会做((int) 演员也不是必需的,也不是一个好主意,因为它混合了有符号和无符号,并且会从某些实现中收到警告)。
猜你喜欢
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 2018-02-01
  • 2021-01-24
相关资源
最近更新 更多