有符号与无符号的类型转换以及数位扩展问题
2006-09-11 09:46
483 查看
有符号与无符号的类型转换以及数位扩展问题
题目:
int main()
{
unsigned int un;
unsigned char uch;
uch = (unsigned char) 128;
un = uch;
printf("un = %d/n", un);
printf("un = %u/n", un);
system("PAUSE");
return 0;
}
int main()
{
int n;
char ch;
ch = (char) 128;
n = ch;
printf("n = %d/n", n);
printf("n = %u/n", n);
}
请问以上两道题的输出是什么
解答:
首先我们需要了解相关知识。
补码表示法 (计算机中,整数通常是以补码来表示的)
正数: 最高有效位为0表示符号为正,数的其余部分则表示数的绝对值
负数: 用一个简单的方法来表示负数负数相对应的正数,用补码表示,按位取反,最后在末位(最低位)加1
用补码表示数时的符号扩展问题。比如从8位扩展到16位,从16位扩展到32位
正数的符号扩展应该在前面补0,而负数的符号扩展则应该在前面补1
(微软竟然给了一个 SafeInt 类的实现来帮助程序员避免对应的错误)
在上面的代码中,第一段代码:
uch = (unsigned char) 128; -> uch = 0x80 = 1000 0000
un = uch; -> (int)n = 0x00000080 = -128 由于 uch 是无符号型,所以高位补1
因此第一段代码的输出应该是:
un = 128
un = 128
第二段代码:
ch = (char) 128; -> ch = 0x80 = 1000 0000
n = ch; -> (int)n = 0xffffff80 = -128 由于 ch 是有符号型,所以高位补0
因此第二段代码的输出应该是:
n = -128
n = 4294967168
题目:
int main()
{
int m;
unsigned int n;
n = 8;
m = -64;
if (20 < (m + n))
printf("20 < (m + n)/n");
else
printf("20 >= (m + n)/n");
printf("m+n = %d/n", m + n);
printf("m+n = %u/n", m + n);
system("PAUSE");
return 0;
}
以上代码的输出是什么
解答:
首先也需要了解相关知识。
char,short int或者int型位段(bit-field),包括它们的有符号或无符号变型,以及枚举类型,可以使用在需要int或unsigned int的表达式中,如果int可以完整地表示源类型的所有值,那么该类型的值就转换为int,否则转换为unsigned int。
例如代码中的 m+n ,无符号数 m 相对于有符号数 n 来说能表示更多的信息,所以在两者运算的时候,m 被转换成了一个很大的无符号数,因此 m+n 的值远大于20,所以 if() 语句中的判断为真。
因此程序输出:
20 < (m + n)
m+n = -56
m+n = 4294967240
题目:
int main()
{
unsigned int un;
unsigned char uch;
uch = (unsigned char) 128;
un = uch;
printf("un = %d/n", un);
printf("un = %u/n", un);
system("PAUSE");
return 0;
}
int main()
{
int n;
char ch;
ch = (char) 128;
n = ch;
printf("n = %d/n", n);
printf("n = %u/n", n);
}
请问以上两道题的输出是什么
解答:
首先我们需要了解相关知识。
补码表示法 (计算机中,整数通常是以补码来表示的)
正数: 最高有效位为0表示符号为正,数的其余部分则表示数的绝对值
负数: 用一个简单的方法来表示负数负数相对应的正数,用补码表示,按位取反,最后在末位(最低位)加1
用补码表示数时的符号扩展问题。比如从8位扩展到16位,从16位扩展到32位
正数的符号扩展应该在前面补0,而负数的符号扩展则应该在前面补1
(微软竟然给了一个 SafeInt 类的实现来帮助程序员避免对应的错误)
在上面的代码中,第一段代码:
uch = (unsigned char) 128; -> uch = 0x80 = 1000 0000
un = uch; -> (int)n = 0x00000080 = -128 由于 uch 是无符号型,所以高位补1
因此第一段代码的输出应该是:
un = 128
un = 128
第二段代码:
ch = (char) 128; -> ch = 0x80 = 1000 0000
n = ch; -> (int)n = 0xffffff80 = -128 由于 ch 是有符号型,所以高位补0
因此第二段代码的输出应该是:
n = -128
n = 4294967168
题目:
int main()
{
int m;
unsigned int n;
n = 8;
m = -64;
if (20 < (m + n))
printf("20 < (m + n)/n");
else
printf("20 >= (m + n)/n");
printf("m+n = %d/n", m + n);
printf("m+n = %u/n", m + n);
system("PAUSE");
return 0;
}
以上代码的输出是什么
解答:
首先也需要了解相关知识。
char,short int或者int型位段(bit-field),包括它们的有符号或无符号变型,以及枚举类型,可以使用在需要int或unsigned int的表达式中,如果int可以完整地表示源类型的所有值,那么该类型的值就转换为int,否则转换为unsigned int。
例如代码中的 m+n ,无符号数 m 相对于有符号数 n 来说能表示更多的信息,所以在两者运算的时候,m 被转换成了一个很大的无符号数,因此 m+n 的值远大于20,所以 if() 语句中的判断为真。
因此程序输出:
20 < (m + n)
m+n = -56
m+n = 4294967240
相关文章推荐
- 类型转换中的符号扩展问题
- C++中四种类型转换以及const_cast是否能改变常量的问题
- int转为short的问题以及类型转换、按位与、相等优先级
- c++类型转换时的符号位扩展
- C++中四种类型转换以及const_cast是否能改变常量的问题
- NET中反射实现 可空类型 与基础类型的转换 以及获取指定属性的大小问题
- 测试整数类型:byte,short,int,long。以及进制之间的转换问题
- 关于类型转换时的“符号扩展”
- C++中有符号类型(int)和无符号类型(unsigned int)混合算术运算的类型转换会出现的问题
- 【转】NET中反射实现 可空类型 与基础类型的转换 以及获取指定属性的大小问题
- C++中四种类型转换以及const_cast是否能改变常量的问题
- 类的operator隐式类型转换为函数指针以及类的伪函数operator()同时存在时二者的选择问题
- 解决vs2013 error C4308: 负整型常量转换为无符号类型问题(转载)
- 无符号数运算问题——C语言隐式类型转换
- 01 C:穿越时空的迷雾(const关键字,算术类型的转换,以及有符号无符号类型转换常见的错误)
- 全局结构体变量的初始化以及将结构体变量转换为char类型输出问题
- 指针变量以及指针变量的类型转换问题
- 按位“或”运算符在带符号扩展操作数上使用;请考虑首先强制转换为较小的无符号类型
- 关于EditText中的getText()方法的返回值类型以及string的转换问题
- Java 基本数据类型与其包装数据类型以及字符串(String)之间的转换问题