什么实际上属于 C11中的"字符类型" - char当然除了?
更确切地说,字符类型的特殊例外(例如,任何对象都可以通过字符类型的左值表达式访问 - 参见C11标准中的§6.5/ 7),它们适用于哪些具体类型?他们似乎适用于uint8_t与int8_t从stdint.h,但这个保障?在另一方面GCC并不认为char16_t从uchar.h一个"性格类型".
当fgetc用于读取流的下一个字符时,通常会检查是否未达到文件结尾
if ((c = fgetc (stream)) != EOF)
Run Code Online (Sandbox Code Playgroud)
哪里c是int类型.然后,文件结束已经达到并且条件将失败,或者c应该是unsigned转换为的char int,预期与EOF-c 不同,因为EOF确保为负.很好......显然.
但是有一个小问题......通常char类型不超过8位,而且int必须至少有16位,所以每个unsigned char都可以表示为int.然而,在这种情况下char会有16或32位(我知道,在实践中情况从来都不是这样......),没有理由为什么人们不能拥有sizeof(int) == 1,所以它(理论上!)可能fgetc (stream)返回EOF(或另一个负值)但文件结尾尚未达到......
我错了吗?如果没有达到文件结尾,C标准中是否会阻止fgetc返回EOF?(如果是的话,我找不到它!).或者if ((c = fgetc (stream)) != EOF)语法不完全可移植?...
编辑:的确,这是问题#3860943的重复.我在第一次搜索时没有找到这个问题.谢谢您帮忙!:-)
我知道整数下溢和溢出是未定义的.
但是,鉴于C++最终编译为汇编,实际定义的行为是不是?
按位表示保持不变,整数格式保持不变0111..11总是会翻转到1000..00,同为下溢,那么为什么不考虑定义的行为?
关于汇编汇编,我是从我们在学校教授的基本程序集中得出的,但代码块给出了
int x = INT_MAX;
int y = x+1;
Run Code Online (Sandbox Code Playgroud)
编译成
00401326 movl $0x7fffffff,0x8(%esp)
0040132E mov 0x8(%esp),%eax
00401332 inc %eax
00401333 mov %eax,0xc(%esp)
Run Code Online (Sandbox Code Playgroud)
现在,无论x的值如何,总是会有inc或add指令?那么,未定义的行为出现在哪里?
octet string和char有什么区别?如何使用八位字符串?任何人都可以在Octet字符串上写一个小C程序吗?八位字符串如何存储在内存中?
在互联网上,我看到声称用便携式C++编写的库,好像它是一个(可能是非官方的)标准.
什么是可移植的C++有一个精确的定义,如果有,它是什么?
我不是要求编写可移植代码的常用做法,但如果真的有什么我们称之为"可移植的c ++".
保留文件字节的最合适的矢量类型是什么?
我正在考虑使用int类型,因为位"00000000"(1字节)被解释为0!
目标是将此数据(字节)保存到文件中,稍后从此文件中检索.
注意:文件包含空字节(以位为"00000000")!
我在这里有点失落.帮我!= D谢谢!
更新I:
要读取我正在使用此功能的文件:
char* readFileBytes(const char *name){
std::ifstream fl(name);
fl.seekg( 0, std::ios::end );
size_t len = fl.tellg();
char *ret = new char[len];
fl.seekg(0, std::ios::beg);
fl.read(ret, len);
fl.close();
return ret;
}
Run Code Online (Sandbox Code Playgroud)
注意I:我需要找到一种方法来确保可以从文件中恢复位"00000000"!
注意二:有关将这些位"00000000"保存到文件的安全方法的建议吗?
注3:当使用char数组时,我在转换该类型的位"00000000"时遇到了问题.
代码片段:
int bit8Array[] = {0, 0, 0, 0, 0, 0, 0, 0};
char charByte = (bit8Array[7] ) |
(bit8Array[6] << 1) |
(bit8Array[5] << 2) |
(bit8Array[4] << 3) |
(bit8Array[3] << 4) |
(bit8Array[2] << 5) |
(bit8Array[1] …Run Code Online (Sandbox Code Playgroud) 来自ISO/IEC 9899:
7.18.1.2最小宽度整数类型
1 typedef名称int_leastN_t指定宽度至少为N的有符号整数类型,这样没有较小大小的有符号整数类型至少具有指定的宽度.因此,int_least32_t表示宽度至少为32位的有符号整数类型.
为什么我应该使用这种类型?
当我决定采用哪种类型来获取我需要的变量时,我会问自己:"它能携带的最大价值是什么?"
所以我将找到一个答案,检查哪个是最大的2 n,哪个大于那个,并采用匹配的精确整数类型.
所以在这种情况下我也可以使用最小宽度整数类型.但为什么?正如我已经知道的那样:它永远不会是一个更大的价值.那么为什么要采取有时可以覆盖的东西呢?
所有其他情况我可以想象哪里甚至无效的ie:
"我的类型至少是......的大小......" - 这个实现无法知道我将获得的最大(例如)用户输入是什么,因此在编译时调整类型将无济于事.
"我有一个变量,我无法确定它将在运行时保持的值大小."
- 编译器在编译时如何知道? - >它也找不到拟合字节大小.
那么这些类型的用途是什么?
对于我的计算,我只需要使用7位空间,所以我使用的是char类型.但是我想知道是否可以声明我自己的类型使用少于一个字节的内存?
对于同一个程序:
const char* s = "abcd";
auto x1 = reinterpret_cast<const int64_t*>(s);
auto x2 = reinterpret_cast<const char*>(x1);
std::cout << *x1 << std::endl;
std::cout << x2 << std::endl; // Always "abcd"
Run Code Online (Sandbox Code Playgroud)
在gcc5(链接):139639660962401
在gcc8(链接):1684234849
我有一个屏蔽程序(为给定大小的下半部分创建一个全位掩码):
template<class T>
T bottom_half() {
T halfway = ((sizeof(T) * 8) / 2);
T mask = (1 << halfway) - 1;
return mask;
}
Run Code Online (Sandbox Code Playgroud)
这要是我称之为正常工作bottom_half<int>()或long或char.但是当我运行某些原因long long,halfway正确设置为32,但是mask是0.那为什么会这样?