为什么签名字符可以保存大于 127 的值?
Why signed char can hold bigger values than 127?
int main()
{
char MCU = 0b00000000;
char al_av = 0b10100000;
// Before bit operation
cout << "MCU = " << int(MCU) << endl;
MCU = MCU | al_av;
// After the bit operation
cout << "MCU = " << int(MCU) << endl; // Expected 160, got -96
char temp = 160;
cout << temp; // got the a with apostrophe
return 0;
}
我预计char temp
的输出是负数(或警告/错误(,因为 160 超过了 [-127,127] 间隔,但相反,结果是 ASCII 表中的结果(带撇号的 a(
关于 cpp 参考:
char - 用于在目标系统上最有效地处理的字符表示形式(与有符号字符或无符号字符具有相同的表示形式和对齐方式,但始终是不同的类型(
我不明白斜体写的是什么(我也不确定它对这个问题有很大帮助(。是否有任何隐式转换?
为什么有符号字符可以容纳大于 127 的值?
不能。
char x = 231;
这里,有一个(隐式(整数转换:231 是int
类型的PR值,在转换为char
(在您的系统上签名(之前获取值-25
。您可以要求编译器使用-Wconstant-conversion
警告您。
char - 可以在目标系统上最有效地处理字符表示的类型(具有与有符号字符或无符号字符相同的表示和对齐方式,但始终是不同的类型(
我不明白斜体写的是什么
这与类型可以保存的内容无关,它只确保三种类型char
、signed char
和unsigned char
具有共同的属性。
从 C++14char
开始,如果signed
,必须是 2 的补码类型。这意味着它的范围至少为 -128 到 +127。重要的是要知道范围可能大于此范围,因此假设大于 127 的数字不能存储在char
中是不正确的,如果signed
。用
std::numeric_limits<char>::max()
以获得您平台上的真正上限。
如果您确实将大于此值的值分配给char
并且char
signed
则代码的行为是实现定义的。通常,这意味着环绕到负数,这实际上是有符号char
类型的普遍行为。
另请注意,ASCII 是 7 位编码,因此说 0 - 127 范围之外的任何字符都是 ASCII 都是错误的。另请注意,ASCII 并不是 C++ 支持的唯一编码。还有其他的。
最后,不同的类型:即使char
是signed
,它也与signed char
是不同的类型。这意味着代码
int main() {
char c;
signed char d;
std::swap(c, d);
}
将始终导致编译错误。
char temp = 160;
它实际上是负面的。关键是cout支持非ASCII字符,因此它将其解释为非负数。cout 可能在使用它之前将其转换为无符号字符(或任何无符号整数类型(。
如果您使用 printf 并告诉它将其解释为整数,您将看到它是一个负值。
printf("%dn", temp); // prints -96
- 为什么签名字符可以保存大于 127 的值?
- 特征::向量;在函数中使用 Eigen::Matrix3f 的值初始化向量,大于 4 个条目
- 在MSDOS编译器上,用大于最大值的值初始化int时输出混乱
- 我应该使用无符号字符而不是 int 来存储永远不会大于 255 的值吗?
- 为什么 UInt64 变量不能包含大于 UInt32::Max 的值?
- 为什么程序显示的值大于结果或垃圾值
- (也许是NP-Hard)求一个集合的子集总数,使得每个子集在与其所有元素相乘时的值都大于X
- 使用std :: find_if with std :: vector找到大于某些值的最小元素
- 2d 数组中大于 10^5 的值未在范围内声明
- 当运算符尝试输入大于变量可以包含的值>>会发生什么情况?
- 获取所有大于某个值的 stl 向量元素
- 对于大于 4GiB 的文件,fread 有时会返回错误的值
- 如果我尝试在 c++ 中将大于 pow(2,64)-1 的值分配给无符号长整型怎么办?
- 用 C++ 编程.字符数组的大小为 5,但也接受大于 5 个字符的值
- 如何将OpenCV中的adaptiveThreshold用于大于255的值(即CV_8UC1类型)
- 如何将大于 std::numeric_limits<fundamental_type>::max() 的值传递给函数?
- 将大于long类型的最大值的值传递给C中的fseek
- 查询大于 X 的值,同时具有其他条件
- 为什么这段代码打印0到297,而不是0到大于297的值?
- 为什么我的代码不能为大于N=508的值工作